muc*_*out 3 python gzip line-breaks codec
我有一个巨大的gzip文本文件,我需要逐行阅读.我选择以下内容:
for i, line in enumerate(codecs.getreader('utf-8')(gzip.open('file.gz'))):
print i, line
Run Code Online (Sandbox Code Playgroud)
在文件后面的某个时刻,python输出与文件不同.这是因为线条因python认为是换行符的奇怪特殊字符而被破坏.当我在'vim'中打开文件时,它们是正确的,但可疑字符的格式很奇怪.有什么我可以做的来解决这个问题吗?
我尝试过其他编解码器,包括utf-16,latin-1.我也试过没有编解码器.
我用'od'查看了文件.果然,它们不应该是\n个字符.但是,"错误的"前缀是一个奇怪的角色.我认为这里有一些编码,一些字符是2字节,但如果没有正确查看,则尾随字节为\n.
根据'od -h file',违规字符为'1d1c'.
如果我更换:
gzip.open('file.gz')
Run Code Online (Sandbox Code Playgroud)
附:
os.popen('zcat file.gz')
Run Code Online (Sandbox Code Playgroud)
它工作正常(实际上,更快).但是,我想知道我哪里出错了.
没有编解码器再试一次.以下内容在使用编解码器时再现了您的问题,没有它时没有问题:
import gzip
import os
import codecs
data = gzip.open("file.gz", "wb")
data.write('foo\x1d\x1cbar\nbaz')
data.close()
print list(codecs.getreader('utf-8')(gzip.open('file.gz')))
print list(os.popen('zcat file.gz'))
print list(gzip.open('file.gz'))
Run Code Online (Sandbox Code Playgroud)
输出:
[u'foo\x1d', u'\x1c', u'bar\n', u'baz']
['foo\x1d\x1cbar\n', 'baz']
['foo\x1d\x1cbar\n', 'baz']
Run Code Online (Sandbox Code Playgroud)