2012-07-14 9 views
16

Tôi đang cố sử dụng mô-đun zipfile để đọc tệp trong một tệp lưu trữ. các tập tin không nén là ~ 3GB và tập tin nén là 200MB. Tôi không muốn chúng trong bộ nhớ khi tôi xử lý dòng tập tin nén theo dòng. Cho đến nay tôi đã nhận thấy một lạm dụng bộ nhớ sử dụng đoạn mã sau:Đọc dòng tệp văn bản được nén lớn theo dòng trong python

import zipfile 
f = open(...) 
z = zipfile.ZipFile(f) 
for line in zipfile.open(...).readlines() 
    print line 

tôi đã làm nó trong C# sử dụng SharpZipLib:

var fStream = File.OpenRead("..."); 
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream); 
var dataStream = unzipper.GetInputStream(0); 

Datastream là không nén. Tôi không thể tìm cách để làm điều đó trong Python. Trợ giúp sẽ được đánh giá cao.

Trả lời

38

Đối tượng tệp Python cung cấp trình lặp, sẽ đọc từng dòng một. file.readlines() đọc tất cả và trả về một danh sách - có nghĩa là nó cần đọc mọi thứ vào bộ nhớ. Cách tiếp cận tốt hơn (mà phải luôn luôn được ưa thích hơn readlines()) là chỉ cần vòng qua các đối tượng chính nó, Ví dụ:

import zipfile 
with zipfile.ZipFile(...) as z: 
    with z.open(...) as f: 
     for line in f: 
      print line 

Lưu ý sử dụng của tôi the with statement - đối tượng tập tin là các nhà quản lý bối cảnh, và với tuyên bố cho phép chúng ta dễ dàng viết mã có thể đọc được để đảm bảo các tệp được đóng khi chặn được thoát (ngay cả khi ngoại lệ). Điều này, một lần nữa, nên luôn luôn được sử dụng khi giao dịch với các tập tin.

+0

không thể nói tốt hơn –