python - 在 python 中使用特定文本编码打开(可能压缩)文件的通用方法

标签 python encoding gzip

我正在编写一段代码来打开一个(可能是 gzip 压缩的)文本文件,该文本文件在 Python 2 和 Python 3 中都有效。

如果我只有普通文本文件(未压缩),我可以这样做:

import io
for line in io.open(file_name, encoding='some_encoding'):
    pass

如果我不关心解码(在 python 2/3 中使用字符串/字节)

if file_name.endswith('.gz'):
    file_obj = gzip.open(file_name)
else:
    file_obj = open(file_name)

for line in file_obj:
    pass

我怎样才能顺利地处理这两种情况?换句话说,如何将decode与gzip.open()平滑整合?

最佳答案

我对此进行了简短测试,它似乎做了正确的事情。您可以向 gzip.GzipFileio.open 提供一个文件 obj,这样

import io
import gzip

f_obj = open('file.gz','r')
io_obj = io.open(f_obj.fileno(), encoding='UTF-8')
gzip_obj = gzip.GzipFile(fileobj=io_obj, mode='r')
gzip_obj.read()

这给了我一个 UnicodeDecodeError,因为我正在读取的文件实际上不是 UTF-8,所以它似乎在做正确的事情。

出于某种原因,如果我使用 io.open 直接打开 file.gz gzip 会说该文件不是压缩文件。

更新 是的,这很愚蠢,流从一开始就是错误的方式。

测试文件

ö
ä
u
y

以下代码使用定义的编解码器对压缩文件进行解码

import codecs
import gzip
gz_fh = gzip.open('file.gz')
ascii = codecs.getreader('ASCII')
utf8 = codecs.getreader('UTF-8') 
ascii_fh = ascii(gz_fh)
utf8_fh = utf8(gz_fh)
ascii_fh.readlines()
-> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

utf8_fh.readlines()
-> [u'\xf6\n', u'\xe4\n', u'u\n', u'y']

codecs.StreamReader 获取流,因此您应该能够将压缩或未压缩的文件传递给它。

http://docs.python.org/library/codecs.html#codecs

关于python - 在 python 中使用特定文本编码打开(可能压缩)文件的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12492696/

相关文章:

Python - 复制jpg文件时出错

Python - 替换字符串中的非 ASCII 字符 (»)

windows - 如何在 Windows 批处理脚本中更改重定向文件的文件编码?

java - java中有没有什么压缩方法可以减少字符串中的字符数?

python - 我应该使用哪个 Enthought EPD 发行版?

python - 使用 rdflib 获取数据库中的所有关系

Python情感分析(比较单词时,文本中重复的单词不计算在内)

python - 我希望我已经创建的 virtualenv 能够访问系统包

asp.net - "Invalid use of response filter"压缩来自 IHttpHandler 的响应时

unix - 如何列出嵌套存档 (.gz) 的内容