【问题标题】:Python Unicode CSV with newline between quotesPython Unicode CSV,引号之间有换行符
【发布时间】:2014-01-23 09:58:39
【问题描述】:

我正在使用 unicodecsv 在 Python 中循环遍历 csv 文件的行。 我的 CSV 文件中的所有字符串都在引号之间,但 csv 阅读器仍将换行符视为行分隔符。

这是我的代码:

with open(path, mode='rU') as f:
    reader = unicodecsv.reader(f, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"', lineterminator="\n")

    for count, row in enumerate(reader):
        if count < row_offset:
            continue
        record = {}
        for col, mapper in enumerate(mappers):
            ...
            ...                                               

这是一个 csv 行的示例:

"test","this line will
continue on the next line","another column",

由于某种原因,读者会将其解读为 2 行而不是 1 行。

编辑

新的示例 CSV 行:

628,2012-07-27 01:59:32,000445,MARC,525,"HE547                           ","1",2012-07-27,,,,,,,,"This is an example, this is a test line.
new line but it is in the same csv line, followed by some enters!


",

【问题讨论】:

  • 这是 Python 3 还是 Python 2?您在这里使用b'' 字符串文字。
  • 你能至少告诉我们这两行返回的是什么吗?随意 futz 内容,但保留初始空格和引号字符。
  • @MartijnPieters:解析器返回一个越界异常,因为换行时没有足够的列。这只发生在该列中有输入的行。所有其他行均已正确处理。

标签: python csv unicode newline


【解决方案1】:

逗号后面有空格;在阅读器上设置skipinitialspace=True 以忽略此:

reader = unicodecsv.reader(f, delimiter=b',', skipinitialspace=True, quoting=csv.QUOTE_MINIMAL, quotechar=b'"', lineterminator="\n")

带有常规reader.csv() 对象的演示:

>>> reader = csv.reader(f, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"')
>>> next(reader)
['test', ' "this line will']
>>> f.seek(0)
>>> reader = csv.reader(f, skipinitialspace=True, delimiter=b',', quoting=csv.QUOTE_MINIMAL, quotechar=b'"')
>>> next(reader)
['test', 'this line will\ncontinue on the next line', 'another column', '']

请注意,如果没有设置skipinitialspace 标志,第二列以' "... 开头,所以是空格和引号。并不是换行不被识别,而是 quote 由于空格没有被拾取。

另一种可能性是您的输入数据使用了 不同 引号字符。无论哪种方式,csv.reader() 都无法识别您的列已被引用。您需要查看不完整列的repr(),以查看从阅读器返回时包含哪些字符,以及该值中仍然存在哪些引号字符(如果有)。

但是,如果没有准确的样本 CSV 数据,很难说您在这里实际遇到了什么问题。

【讨论】:

  • 还是一样,问题中的空格我也去掉了。很抱歉造成混乱,我的错。
  • @FrederikVoordeckers:你能给一个带有真实数据的馅饼的链接吗?因为我可以用那里的空格准确地重现问题。您需要提供一些没有空格但仍会产生问题的测试数据。
  • 数据不公开,不能分享,因为它包含机密信息...
  • 您仍然需要生成 something 来显示实际问题;创建一个示例 CSV,当与您的代码一起运行时,显示换行符未被识别为引用列的一部分。就目前而言,除非您的引号不是常规的 ASCII 引号,或者逗号和引号之间有空格,否则我无法重现该问题。
  • 添加了导致问题的一行示例。非常感谢您的帮助。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2019-01-07
  • 2012-05-11
  • 2014-12-11
  • 2016-08-13
  • 2023-04-04
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多