簡體   English   中英

在python中使用特定文本編碼打開(可能是gzip)文件的通用方法

[英]Generic way to open (possibly gzipped) file with specific text encoding in python

我正在編寫一段代碼,打開一個(可能是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

我怎樣才能順利地處理這兩種情況呢? 換句話說,如何將解碼與gzip.open()平滑地集成?

我對此進行了簡要測試,似乎做了正確的事情。 你可以提供一個文件obj到gzip.GzipFileio.open

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.gzgzip說該文件不是壓縮文件。

更新是的,這很愚蠢,流是錯誤的方式開始。

測試文件

ö
ä
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM