我有以下代码,用于推断csv文件中的字段分隔符和行终止符:
first_line = b'132605,1\r\n'
dialect = csv.Sniffer().sniff(first_line)从上面的情况来看,我希望csv嗅探器能够推断分隔符是,,行终止符是\r\n。但是,它返回以下错误:
TypeError:不能对类似字节的对象使用字符串模式
解决这个问题最好的办法是什么?
注意,我在b模式下打开它的原因是为了能够看到所有字符,例如:
>>> open('10_no_headers.csv','r+b').read()[:10]
b'132605,1\r\n'
>>> open('10_no_headers.csv','r').read()[:10]
'132605,1\n1' # doesn't show the \r发布于 2018-12-19 19:15:16
以“r”模式打开并提供newline=''
import csv
with open('foo.txt', 'w') as f:
f.write('132605,1\r\n')
with open('foo.txt', 'r') as f:
print(repr(next(f)))
with open('foo.txt', 'rb') as f:
print(repr(next(f)))
with open('foo.txt', 'r', newline='') as f:
line = next(f)
dialect = csv.Sniffer().sniff(line)
print(repr(line))
print ('FIELED:', repr(dialect.delimiter), 'LINE:', repr(dialect.lineterminator))输出
'132605,1\n'
b'132605,1\r\n'
'132605,1\r\n'
FIELED: ',' LINE: '\r\n'newline控制通用换行符模式的工作方式(它只适用于文本模式)。它可以是0、'‘、'\n’、'\r‘和’\r‘。它的工作如下:
发布于 2018-12-19 18:44:29
一种可能的选择是在将其传递给Sniffer之前对其进行解码。例如:
import csv
first_line = b'132605,1\r\n'
dialect = csv.Sniffer().sniff(first_line.decode('utf-8'))
print ('FIELED:', repr(dialect.delimiter), 'LINE:', repr(dialect.lineterminator))
FIELED: ',' LINE: '\r\n'https://stackoverflow.com/questions/53857273
复制相似问题