在使用Python读取csv文件时,指定换行符('\n')。

13 浏览
0 Comments

在使用Python读取csv文件时,指定换行符('\n')。

我想使用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]

尚未成功找到正确的解决办法。有什么建议吗?

我还阅读了关于newline的文档:如果未指定newline='',则引号字段内嵌的换行符将无法正确解释,并且在使用\r\n的平台上,在写入时会添加额外的\r。指定newline=''总是安全的,因为csv模块会处理自己的(通用的)换行符。

所以我对newline方法的理解是:

1)它是必需的,

2)它是否表示输入文件将通过空白字符分隔为行?

0
0 Comments

在使用Python读取csv文件时,指定换行符('\n')的问题是因为以下原因:

1. 在所有的csv情况下,newline=''是正确的,而不指定它在许多情况下会导致错误。文档推荐使用它的原因正是你遇到的问题。

2. newline=''并不意味着使用空格进行分割;它在open函数的文档中有明确说明:

如果[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

如果输入文件使用的是'\n'作为换行符,你推荐的代码会正确地读取并分割每一行,对吗?

是的。当你使用newline=''时,无论输入文件使用什么样的行尾约定,它都会将任何可能的行尾视为行的结束,并返回该行的数据(包括未转换的表示行尾的字符)。csv模块会识别不符合CSV方言的行尾,并根据所选择的方言将行组合起来(并在引号字段内部出现换行符时组合行,因此字段中的换行符不会在读取时将其转换为多条记录)。

非常感谢你指向正确的open函数文档。再次感谢你的帮助和耐心!让我在这方面再问一个问题:如果对于所有的输入情况都使用newline='',它如何区分一个输入文件使用'/n'作为换行符,另一个文件使用', " '?

你在问什么格式下使用逗号分隔记录(而不是字段)?这个问题甚至没有意义。对于记录,csv的文档明确说明会忽略读取器的lineterminator的值,只会将\r\n视为行终止符;你不能使用非换行符的字符在读取时分隔记录。

0