我正在尝试使用pandas读取csv文件,其中有一个名为Tags的列,其中包含用户提供的标签,例如-, "", '',1950年代,16世纪等标签。由于这些是用户提供的,因此也会有许多错误输入的特殊字符。问题在于,我无法使用pandas read_csv打开csv文件。它显示错误:Cparser,解析数据时出现错误。有人能帮我将csv文件读入pandas吗?
我正在尝试使用pandas读取csv文件,其中有一个名为Tags的列,其中包含用户提供的标签,例如-, "", '',1950年代,16世纪等标签。由于这些是用户提供的,因此也会有许多错误输入的特殊字符。问题在于,我无法使用pandas read_csv打开csv文件。它显示错误:Cparser,解析数据时出现错误。有人能帮我将csv文件读入pandas吗?
好的。从一个格式不良的CSV开始,我们无法读取:
>>> !cat unquoted.csv
1950's,xyz.nl/user_003,bad, 123
17th,red,flower,xyz.nl/user_001,good,203
"",xyz.nl/user_239,not very,345
>>> pd.read_csv("unquoted.csv", header=None)
Traceback (most recent call last):
File "<ipython-input-40-7d9aadb2fad5>", line 1, in <module>
pd.read_csv("unquoted.csv", header=None)
[...]
File "parser.pyx", line 1572, in pandas._parser.raise_parser_error (pandas/src/parser.c:17041)
CParserError: Error tokenizing data. C error: Expected 4 fields in line 2, saw 6
我们可以制作更美观的版本,利用最后三列的良好特性:
import csv
with open("unquoted.csv", "rb") as infile, open("quoted.csv", "wb") as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for line in reader:
newline = [','.join(line[:-3])] + line[-3:]
writer.writerow(newline)
它会产生
>>> !cat quoted.csv
1950's,xyz.nl/user_003,bad, 123
"17th,red,flower",xyz.nl/user_001,good,203
,xyz.nl/user_239,not very,345
然后我们可以阅读它:
>>> pd.read_csv("quoted.csv", header=None)
0 1 2 3
0 1950's xyz.nl/user_003 bad 123
1 17th,red,flower xyz.nl/user_001 good 203
2 NaN xyz.nl/user_239 not very 345
我建议从源头开始解决这个问题,让数据以可容忍的格式呈现。不应该依赖于这样的技巧,如果不及时修复,可能会变得无法挽回。
line[:-3]
是一个列表,它包含除最后三个元素以外的所有元素。 ','.join(some_sequence)
使用字符串,
-- 逗号 -- 将它们组合在一起。这是因为如果你把print line
放在内部循环里面,你会发现CSV读取器不知道如何不把17th,red,flower
分成多个元素,所以我必须重新将其组合成一个术语。方括号[]
使其成为一个单元素列表。第二项line[-3:]
表示“从结尾开始的前三个元素”的所有列表元素。所以实际上它只是“用除了最后三个元素以外的所有元素重新组合第一个元素来创建一个新的列表”。 - DSM