2009-12-10 36 views
23

Tôi đang cố gắng đọc tệp được nén (.gz) trong python và đang gặp một số sự cố.Đọc các ký tự utf-8 từ tệp gzip trong python

Tôi đã sử dụng mô-đun gzip để đọc nhưng tệp được mã hóa dưới dạng tệp văn bản utf-8 để cuối cùng nó đọc một ký tự không hợp lệ và bị treo.

Có ai biết cách đọc tệp gzip được mã hóa dưới dạng tệp utf-8 không? Tôi biết rằng có một mô-đun codec có thể giúp nhưng tôi không thể hiểu cách sử dụng nó.

Cảm ơn!

import string 
import gzip 
import codecs 

f = gzip.open('file.gz','r') 

engines = {} 
line = f.readline() 
while line: 
    parsed = string.split(line, u'\u0001') 

    #do some things... 

    line = f.readline() 
for en in engines: 
    print(en) 
+0

Bạn có thể đăng mã bạn có cho đến nay không? –

+0

Bạn có thể chuyển đổi tệp utf-8 thành ascii sau đó cố gắng giải nén tệp đó không? hmm .... – whatsisname

Trả lời

17

Tôi không hiểu tại sao điều này nên khó khăn như vậy.

Bạn đang làm gì chính xác? Vui lòng giải thích "cuối cùng nó đọc một ký tự không hợp lệ".

Nó phải là đơn giản như:

import gzip 
fp = gzip.open('foo.gz') 
contents = fp.read() # contents now has the uncompressed bytes of foo.gz 
fp.close() 
u_str = contents.decode('utf-8') # u_str is now a unicode string 

EDITED

Câu trả lời này làm việc cho Python2 trong Python3, vui lòng xem câu trả lời @SeppoEnarvi 's tại https://stackoverflow.com/a/19794943/610569 (nó sử dụng chế độ rt cho gzip.open.

+0

+1 ... Đó là câu trả lời rõ ràng nhất và ít phức tạp nhất trong số 3 câu trả lời từ trước tới nay. –

+1

Không nhất thiết phải phức tạp nhất, trong đó bạn phải giải mã từng dòng bạn đọc. Trong việc thực hiện getreader, điều này xảy ra tự động vì vậy mỗi dòng là unicode – SecurityJoe

+0

Trong khi nó là một giải pháp tốt đẹp, tôi có một cảm giác rằng giải pháp này sẽ không quy mô tốt với các tập tin lớn. –

20

Có thể

import codecs 
zf = gzip.open(fname, 'rb') 
reader = codecs.getreader("utf-8") 
contents = reader(zf) 
for line in contents: 
    pass 
+2

Là một lớp lót: cho dòng trong codecs.getreader ('utf-8') (gzip.open (fname), errors = 'replace') cũng thêm quyền kiểm soát xử lý lỗi – SecurityJoe

0

Ở dạng pythonic (2.5 hoặc cao hơn)

from __future__ import with_statement # for 2.5, does nothing in 2.6 
from gzip import open as gzopen 

with gzopen('foo.gz') as gzfile: 
    for line in gzfile: 
     print line.decode('utf-8') 
27

Điều này có thể bằng Python 3.3:

import gzip 
gzip.open('file.gz', 'rt', encoding='utf-8') 

ý rằng gzip.open() đòi hỏi bạn phải xác định rõ ràng chế độ văn bản ('t').

4

Các lỗi giải mã được sản xuất ở trên. Tôi đã sử dụng điều này:

for line in io.TextIOWrapper(io.BufferedReader(gzip.open(filePath)), encoding='utf8', errors='ignore'): 
    ... 
Các vấn đề liên quan