在使用Python读取csv文件时,指定换行符('\n')。
在使用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)它是否表示输入文件将通过空白字符分隔为行?
在使用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
视为行终止符;你不能使用非换行符的字符在读取时分隔记录。