【问题标题】:Reading tab-delimited file with Pandas - works on Windows, but not on Mac使用 Pandas 读取制表符分隔的文件 - 适用于 Windows,但不适用于 Mac
【发布时间】:2015-03-09 21:04:59
【问题描述】:

我一直在使用 Pandas/Python 在 Windows 中读取制表符分隔的数据文件,没有任何问题。数据文件的前三行包含注释,然后是标题。

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

我现在正尝试用我的 Mac 读取这个文件。 (我第一次在 Mac 上使用 Python。)我收到以下错误。

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

如果将 read_csverror_bad_lines 参数设置为 False,我会得到以下信息,该信息一直持续到最后一行的末尾。

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

我需要为 encoding 参数指定一个值吗?似乎我不应该这样做,因为在 Windows 上读取文件可以正常工作。

【问题讨论】:

  • 您是否在两个操作系统上使用完全相同版本的 pandas?您能否提供一些示例数据来说明 Mac 上的问题?
  • 无关:你了解 Python 中(0)(0,) 之间的区别吗?注意:(0)0(0,)0, -- 逗号创建一个元组(空的除外),而不是括号。
  • 你试过df = pd.read_table(myfile, skiprows=[0,1,2], header=0)吗?
  • 大家好。感谢您的建议。我提出了一个临时解决方案,但可能需要重新审视这个问题并在未来寻找更好的解决方案。如果我这样做,我会进一步研究你的建议。我的临时解决方案是获取我拥有的 csv 文件(并且之前已使用 Excel 转换为有问题的制表符分隔文件)并将其保存为带有 Google 文档的 .tsv。我使用 Gdocs 只是因为它是当时我可用的最方便的文档应用程序。这种转换奏效了。我相信,Pandas 能够正确读取文件,然后继续执行我的其余代码。
  • 我怀疑您在这里看到的 Mac 问题是行终止符。在 Mac 上制作的电子表格可以通过各种库引起各种有趣的行为,包括 python 中的 csv_reader 库

标签: python macos pandas import csv


【解决方案1】:

最大的线索是所有行都在一行中返回。这表明行终止符被忽略或不存在。

您可以为 csv_reader 指定行终止符。如果您使用的是 Mac,则创建的行将以 \r 而不是 linux 标准的 \n 结尾,或者更好的是带有 \r\n 的 windows 的吊带和腰带方法。

pandas.read_csv(filename, sep='\t', lineterminator='\r')

您还可以使用编解码器包打开所有数据。这可能会以牺牲文档加载速度为代价来提高稳健性。

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')

【讨论】:

  • 添加编解码器的代码帮助了我。然后我意识到 read_csv 中有一个参数可以做到这一点。我添加了 encoding='utf-16' 并为我解决了这个问题。
【解决方案2】:

另一种选择是将engine='python' 添加到命令pandas.read_csv(filename, sep='\t', engine='python')

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2015-06-22
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多