【问题标题】:CSV reader incorrectly returns first element of lineCSV 阅读器错误地返回行的第一个元素
【发布时间】:2020-05-21 05:09:34
【问题描述】:

我正在使用 python 读取具有以下设置的 CSV 文件:

import unicodecsv, ssl    
ctx = ssl._create_unverified_context()
    response = urllib2.urlopen(url, timeout=300, context=ctx)
    data = unicodecsv.reader(response,
                              delimiter=";",
        quotechar="\"",
        doublequote=False,
        quoting=unicodecsv.QUOTE_ALL,
        skipinitialspace=True,
        encoding="utf-8-sig")

对于这一行:

“ID”;“产品”;“URL”;“颜色”;“库存”

它返回: “ID”、产品、URL、颜色、库存

所以对于行中的第一个元素,它保留引号。我使用 utf-8-sig 因为有 BOM 字符。

【问题讨论】:

  • 发布minimal reproducible example而不是显示设置更有效。
  • 我已经用一些代码更新了这个例子。
  • 为什么你有两次skipinitialspace和encoding?删除这些,并在 response = io.BytesIO(b'\xef\xbb\xbf' + '"ID";"Product";"URL";","Color";"Stock"'.encode()) 上运行它,我无法重现您的错误 - list(data) 是 [['ID', 'Product', 'URL', ',Color"', 'Stock']]。
  • 使用unicodecsv 是否意味着您使用的是Python 2?你可能应该这么说,如果是的话,添加一个相应的标签。
  • 是的,python 2。@Amadan 我已经删除了重复的属性。我看到你的结果也有错误,所以可能是相似的。 -> ',颜色"'

标签: python python-2.7 csv


【解决方案1】:

确认为 Python2 的 unicodecsv 中的错误(请参阅issue 81)。

unicodecsv.UnicodeReader 没有将编码传递给底层csv.reader,因此它不知道应该剥离 BOM,因此第一个字段不以引号字符开头,并且不算作引用字段。

此时问题已存在 2.5 年,该项目最后一次接触是在 4 年前,并且似乎已被废弃(根据 issue 92)。我强烈建议离开unicodecsv。如果必须使用它,请自己将响应读入字符串,剥离 BOM,然后将清理后的文本通过 io.StringIO 传递给 unicodecsv。

【讨论】:

猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多