【问题标题】:Specify Newline character ('\n') in reading csv using Python在使用 Python 读取 csv 时指定换行符 ('\n')
【发布时间】:2017-03-21 11:24:21
【问题描述】:

我想使用 Python 3 读取每行由换行符 ('\n') 指示的 csv 文件。这是我的代码:

import csv
with open(input_data.csv, newline ='\n') as f:
        csvread = csv.reader(f)
        batch_data = [line for line in csvread]

以上代码报错:

batch_data = [line for line in csvread].
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

阅读这些帖子:CSV new-line character seen in unquoted field error,还尝试了我能想到的这些替代方案:

with open(input_data.csv, 'rU', newline ='\n') as f:
        csvread = csv.reader(f)
        batch_data = [line for line in csvread]


with open(input_data.csv, 'rU', newline ="\n") as f:
        csvread = csv.reader(f)
        batch_data = [line for line in csvread]

目前还没有得到正确的运气。有什么建议吗?

我也在阅读documentation about newline:如果没有指定newline='',嵌入在引用字段中的换行将不会被正确解释,并且在使用\r\n行的平台上会额外写一个\r添加。指定 newline='' 应该始终是安全的,因为 csv 模块自己(通用)换行符处理。

所以我对这种换行方式的理解是:

1)这是必需品,

2) 它是否表明输入文件将被空格字符分割成行?

【问题讨论】:

  • 尝试以二进制模式打开文件open("filename.csv", 'rb')
  • 我已经看到文件中有单独的 CR (\r) 时会发生这种情况。尝试拆分行并去除空格。
  • 你应该在 Python 3 中传递 newline='' 并让 csv 模块处理换行符。
  • @thebjorn:这仅在 Python 2 上有效。

标签: python python-3.x csv


【解决方案1】:
  1. newline='' 在所有csv 情况下都是正确的,并且在许多情况下未能指定它是错误的。文档推荐它的原因正是您遇到的。

  2. newline='' 不代表“空格”用于分割;具体是documented on the open function

如果 [newline] 为 '',则启用通用换行模式,但行尾会返回给调用者,但未翻译。

所以对于newline='',所有原始\r\n 字符都将原封不动地返回。通常,在通用换行符模式下,任何类似换行符的序列(\r\n\r\n)都会在输入中转换为 \n。但是对于 CSV 输入,您不希望这样,因为 CSV 方言通常对换行符的构成非常挑剔(Excel 方言仅需要 \r\n)。

你的代码应该是:

import csv
with open('input_data.csv', newline='') as f:
    csvread = csv.reader(f)
    batch_data = list(csvread)

如果这不起作用,您需要查看您的 CSV 方言并确保您正确初始化 csv.reader

【讨论】:

  • 非常感谢您将我指向正确的 open 函数文档。只是为了确认我对您的理解正确,如果输入文件使用'\n',您推荐的代码将正确读取和拆分每一行,对吗?
  • 我反复要求确认,b/c 输入文件太大而无法以 csv 格式打开(我看不到它)。唯一知道它的信息是“\n”分隔每一行。我不知道通过比较真实的 csv 文件和文件中读取的代码来验证我的代码是否进行了正确的行分隔。
  • @enaJ:是的。当您使用 newline='' 时,输入文件使用什么行尾约定并不重要,它会将 any 可能的行尾视为行尾并从该行返回数据(包括表示行尾的未转换字符)。 csv 模块将识别与 CSV 方言不匹配的结尾,并根据需要组合行以匹配所选方言(并在换行符出现在带引号的字段内时组合行,因此字段中的嵌入换行符不会转动读取时将其写入多条记录)。
  • 再次感谢您的大力帮助和耐心等待!!让我在这方面再问一个问题:如果 'newline ='' " ' 用于所有输入情况,它如何区分输入文件使用 '/n' 作为换行符和另一个文件使用 ', "?
  • @enaJ:您使用什么格式记录(而不是字段)用逗号分隔?这个问题甚至没有意义。作为记录,csv 被记录为忽略lineterminator 对读者的值,而只是将\r\n 视为行终止符;您不能在读取时使用非换行符来分隔记录。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2014-04-20
  • 2018-07-01
相关资源
最近更新 更多