【问题标题】:Problems reading CSV file with commas and characters in pandas在熊猫中读取带有逗号和字符的 CSV 文件时出现问题
【发布时间】:2013-01-11 02:34:17
【问题描述】:

我正在尝试使用 pandas 读取一个 csv 文件,该文件有一个名为标签的列,其中包含用户提供的标签,并具有 - 、“”、“”、1950 年代、16 世纪等标签。由于这些是用户提供的,因此也有许多特殊字符被错误输入。问题是我无法使用 pandas read_csv 打开 csv 文件。它显示错误:Cparser,错误标记数据。有人可以帮我将 csv 文件读入 pandas 吗?

【问题讨论】:

  • 为了加快这个过程,你能从文件中发布一些给你带来麻烦的示例行吗?
  • 标签字段是否被引用?如果没有,你会有一些困难
  • pandas._parser.CParserError:数据标记错误。 C 错误:预期第 3 行中有 4 个字段,看到 8 Tag 字段中的第 3 列是逗号。标签字段没有被引用。有没有不引用 Tag 列的解决方法?
  • Urf。 IIRC,您的列是“标签、用户、质量、Cluster_id”,是吗?其他三个行为(没有不带引号的逗号)吗?如果是这样,那么我们可以通过遍历每一行来挽救它,取最后三行,并说其他所有内容都应该进入 Tag 字段。
  • 是的,没错,列就是你提到的。用户是一个URI,例如:xyz.nl/user_001。 Cluster_id 只包含 1 -500 的值。质量有:好、坏、有用-有用、有用-不有用等。只有标签字段包含带有 的单元格,以及在一个单元格中包含诸如 17th、red、flower 等单词的单元格。这些细胞会导致问题

标签: python csv special-characters pandas


【解决方案1】:

好的。从我们无法读取的格式错误的 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

不过,我会考虑从源头解决此问题并以可接受的格式获取数据。像这样的技巧应该没有必要,而且很容易无法修复。

【讨论】:

  • 您好,感谢您的解决方案。你能解释一下这条特定的线是做什么的吗?换行 = [','.join(line[:-3])] + line[-3:]
  • line[:-3] 是一个列表,其中包含除最后三个之外的行的所有元素。 ','.join(some_sequence) 使用字符串 "," -- 一个逗号 -- 来组合它们。这是因为如果您将print line 放在内部循环中,您可以看到CSV 阅读器不知道不要拆分17th,red,flower,因此我必须将其重新组合为一个术语。方括号 [] 使它成为一个单元素列表。第二个术语line[-3:] 表示“列表中的所有元素,从最后三个开始”。所以实际上它只是“创建一个新列表,其中第一个元素从除最后三个之外的所有元素中重新组合。”
  • 我尝试了上面的代码,但对我来说,我得到了与 outfile 相同的 infile。(我没有得到带引号的标签)在我的 infile 中,有标签字段只有“,”“# "等。您认为这是造成问题的原因吗?
  • 真得看一些麻烦事的例子再说。
  • 当我运行代码时,它没有报错,只是将 infile 复制到 outfile 中。标签的一些例子是 [,],[*man],[12a44],[17thcentury,flower,red],[1920's],[19th century,painting],[3/4 angle][age?]。这些主要是用户输入的在线绘画收藏标签。有些标签只是逗号,还包含特殊字符的组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多