2017-08-21 14 views
5

Tôi đang cố phân tích một tệp lớn, từng dòng một, để có thông tin liên quan. Tôi có thể đang nhận tệp nén hoặc giải nén (tôi có thể phải chỉnh sửa tệp zip ở giai đoạn sau).Phân tích các tập tin lớn, có thể nén, bằng Python

Tôi đang sử dụng mã sau nhưng tôi cảm thấy rằng, vì tôi không nằm trong câu lệnh with, tôi không phân tích cú pháp dòng tệp và thực tế đang tải toàn bộ tệp file_content vào bộ nhớ.

if ".gz" in FILE_LIST['INPUT_FILE']: 
    with gzip.open(FILE_LIST['INPUT_FILE']) as input_file: 
     file_content = input_file.readlines() 
else: 
    with open(FILE_LIST['INPUT_FILE']) as input_file: 
     file_content = input_file.readlines() 

for line in file_content: 
    # do stuff 

Bất kỳ đề xuất nào về cách xử lý này? Tôi không muốn giải nén tệp bên ngoài khối mã, vì điều này cần phải là chung chung và tôi sẽ phải dọn dẹp nhiều tệp.

+1

sử dụng 'readline()' thay vì 'readlines()' để đọc dòng tệp theo dòng – Stack

+0

Tôi nghĩ rằng vấn đề là nhiều hơn để làm với thực tế bởi thời gian tôi nhận được để 'cho dòng trong file_content:' Tôi đã mở, đọc vào bộ nhớ và đóng tập tin. Tôi có thể sử dụng 'readline()' như là nhưng tôi phải lặp lại mã cho cả hai nhánh 'if else:'. – AllynH

Trả lời

5

readlines đọc tệp đầy đủ. Vì vậy, đó là một không-đi cho các tập tin lớn.

Thực hiện 2 khối ngữ cảnh như bạn đang làm và sau đó sử dụng việc xử lý input_file bên ngoài chúng không hoạt động (hoạt động trên tệp đã đóng). Để có được tốt nhất của cả hai thế giới, tôi sẽ sử dụng một điều kiện bậc ba cho khối ngữ cảnh (xác định nếu open hoặc gzip.open phải được sử dụng), sau đó lặp lại trên các dòng.

open_function = gzip.open if ".gz" in FILE_LIST['INPUT_FILE'] else open 
with open_function(FILE_LIST['INPUT_FILE'],"r") as input_file: 
    for line in input_file: 

lưu ý rằng tôi đã thêm chế độ "r" để đảm bảo để làm việc trên văn bản không thuộc nhị phân (mặc định là gzip.open nhị phân)

Alternative: open_function thể được thực hiện chung vì vậy nó không phụ thuộc trên FILE_LIST['INPUT_FILE']:

open_function = lambda f: gzip.open(f,"r") if ".gz" in f else open(f) 

một lần xác định, bạn có thể tái sử dụng nó theo ý thích

with open_function(FILE_LIST['INPUT_FILE']) as input_file: 
    for line in input_file: 
+1

Tôi muốn tách biệt câu lệnh 'with' không thể đọc được. Trước tiên, hãy xác định cách bạn sẽ mở tệp, 'fopen = gzip.open if" .gz "trong FILE_LIST ['INPUT_FILE'] else open', sau đó thực hiện phần còn lại,' với fopen (FILE_LIST ['INPUT_FILE']) làm input_file: ... ' – Yigal

+0

có, nó rõ ràng là tốt hơn một khi đã chỉnh sửa! –

+0

Không, nó trông lạnh hơn trước. : p –

Các vấn đề liên quan