Python行文件迭代和奇怪的字符

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)

它工作正常(实际上,更快).但是,我想知道我哪里出错了.

DS.*_*DS. 5

没有编解码器再试一次.以下内容在使用编解码器时再现了您的问题,没有它时没有问题:

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)