首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类似字节的对象上使用csv.Sniffer

在类似字节的对象上使用csv.Sniffer
EN

Stack Overflow用户
提问于 2018-12-19 18:32:46
回答 2查看 618关注 0票数 0

我有以下代码,用于推断csv文件中的字段分隔符和行终止符:

代码语言:javascript
复制
first_line = b'132605,1\r\n'
dialect = csv.Sniffer().sniff(first_line)

从上面的情况来看,我希望csv嗅探器能够推断分隔符是,,行终止符是\r\n。但是,它返回以下错误:

TypeError:不能对类似字节的对象使用字符串模式

解决这个问题最好的办法是什么?

注意,我在b模式下打开它的原因是为了能够看到所有字符,例如:

代码语言:javascript
复制
>>> 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-19 19:15:16

以“r”模式打开并提供newline=''

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
'132605,1\n'
b'132605,1\r\n'
'132605,1\r\n'
FIELED: ',' LINE: '\r\n'

从医生那里

newline控制通用换行符模式的工作方式(它只适用于文本模式)。它可以是0、'‘、'\n’、'\r‘和’\r‘。它的工作如下:

  • 从流读取输入时,如果换行符为None,则启用通用换行符模式。输入中的行可以以'\n‘、'\r’或‘\r’结尾,这些行在返回给调用者之前被翻译成'\n‘。如果是“”,则启用通用换行符模式,但行尾返回给调用者。如果它具有任何其他合法值,则输入行仅由给定字符串终止,行结束将未翻译返回给调用方。
  • 当将输出写入流时,如果换行符为None,则所写的任何'\n‘字符将被转换为系统默认行分隔符os.linesep。如果换行符为“”或“\n”,则不进行翻译。如果换行符是任何其他合法值,则所写的任何'\n‘字符将被转换为给定的字符串。
票数 1
EN

Stack Overflow用户

发布于 2018-12-19 18:44:29

一种可能的选择是在将其传递给Sniffer之前对其进行解码。例如:

代码语言:javascript
复制
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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53857273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档