首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python选项卡分隔的文件解析问题

问python选项卡分隔的文件解析问题
EN

Stack Overflow用户
提问于 2014-10-01 16:56:13
回答 1查看 477关注 0票数 0

在mysql中,我正在使用外档生成一个选项卡分隔的输出文件。然后使用python加载tsv并对其进行处理。我觉得好像遗漏了什么,但我不知道如何让csv.reader接受引用的字段可以包含\t选项卡、\n换行符、\r回车等的数据。csv.reader总是打断all换行符上的行,而不仅仅是引用字段之外的\n换行符。

设置:

代码语言:javascript
复制
with open('/path/to/file.tsv', 'rbU') as f:
    reader = csv.reader(
        f,
        delimiter='\t',
        lineterminator='\n',
        quoting=csv.QUOTE_ALL
    )
    for line in reader:
        #  do something

示例:

在下面的示例中,\r是实际的回车,\n是实际的换行符,\N是mysql输出的空值。

代码语言:javascript
复制
"4256996"   "test@gmail.com"    "Y  "   "98230\r"   "2012-07-10T12:00:00"   "some  location"    \N  \N  "false" "aaa"   "another-field" "true"  1

由此产生的产出:

代码语言:javascript
复制
['4256996', 'test@gmail.com', 'Y\t', '98230'], ['2012-07-10T12:00:00', 'some  location', '\\N', '\\N', 'false', 'aaa', 'another-field', 'true', '1']

是否有一种方法可以让csv.reader正确地读取这些输入数据,或者这是csv.reader对象的某种限制?

注意:如果您试图复制这一点,请确保将\r替换为实际回车,将\n替换为实际换行符,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 17:50:14

您只需要在二进制模式下打开文件。通过添加'U' (通用换行符模式),您可以指示Python用\n替换任何\r。

代码语言:javascript
复制
with open('/path/to/file.tsv', 'rb') as f:

一旦只读取二进制数据,您的示例输入就可以工作:

代码语言:javascript
复制
>>> import csv
>>> from io import BytesIO
>>> sample = BytesIO('''\
... "4256996"\t"test@gmail.com"\t"Y  "\t"98230\r"\t"2012-07-10T12:00:00"\t"some  location"\t\\N\t\\N\t"false"\t"aaa"\t"another-field"\t"true"\t1\r\n''')
>>> sample.readline()
'"4256996"\t"test@gmail.com"\t"Y  "\t"98230\r"\t"2012-07-10T12:00:00"\t"some  location"\t\\N\t\\N\t"false"\t"aaa"\t"another-field"\t"true"\t1\r\n'
>>> sample.seek(0)
0L
>>> reader = csv.reader(sample, delimiter='\t',
...         lineterminator='\n',
...         quoting=csv.QUOTE_ALL
...     )
>>> next(reader)
['4256996', 'test@gmail.com', 'Y  ', '98230\r', '2012-07-10T12:00:00', 'some  location', '\\N', '\\N', 'false', 'aaa', 'another-field', 'true', '1']

为了说明,使用U模式集读取一行Python错误地读取数据:

代码语言:javascript
复制
>>> sample.seek(0)
0L
>>> open('/tmp/test.csv', 'wb').write(sample.read())
>>> f = open('/tmp/test.csv', 'rbU')
>>> f.readline()
'"4256996"\t"test@gmail.com"\t"Y  "\t"98230\n'
>>> f = open('/tmp/test.csv', 'rb')
>>> f.readline()
'"4256996"\t"test@gmail.com"\t"Y  "\t"98230\r"\t"2012-07-10T12:00:00"\t"some  location"\t\\N\t\\N\t"false"\t"aaa"\t"another-field"\t"true"\t1\r\n'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26146522

复制
相关文章

相似问题

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