2011-11-16 65 views
21

Tôi muốn nén một tệp bằng Python. Tôi đang cố gắng sử dụng subprocss.check_call(), nhưng nó vẫn không thành công với lỗi 'OSError: [Errno 2] Không có tập tin hoặc thư mục như vậy'. Có vấn đề gì với những gì tôi đang cố gắng ở đây không? Có cách nào tốt hơn để gzip một tập tin hơn bằng cách sử dụng subprocess.check_call?gzip một tệp trong Python

from subprocess import check_call 

def gZipFile(fullFilePath) 
    check_call('gzip ' + fullFilePath) 

Cảm ơn !!

+11

Tại sao không http://docs.python.org/library/gzip.html? – Ski

+0

liên quan: để tạo một tarball gzipped 'archive.tar.gz' từ thư mục'/dir/path', bạn có thể sử dụng 'shutil.make_archive ('archive', 'gztar', '/ dir/path')' – jfs

Trả lời

13

Hãy thử điều này:

check_call(['gzip', fullFilePath]) 

Tùy thuộc vào những gì bạn đang làm với dữ liệu của những tập tin này, liên kết Skirmantas để http://docs.python.org/library/gzip.html cũng có thể hữu ích. Lưu ý các ví dụ ở gần cuối trang. Nếu bạn không cần truy cập dữ liệu, hoặc không có dữ liệu đã có trong mã Python của bạn, việc thực hiện gzip có thể là cách sạch nhất để làm điều đó, do đó bạn không phải xử lý dữ liệu bằng Python.

+0

tốt, idk nếu "sạch" là từ thích hợp cho nó, nhưng nó chắc chắn là cách nhanh nhất, và một trong những cần mã ít nhất về phía bạn. –

46

Có một mô-đun gzip. Cách sử dụng:

Ví dụ về làm thế nào để tạo ra một tập tin GZIP nén:

import gzip 
content = "Lots of content here" 
f = gzip.open('/home/joe/file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Ví dụ về làm thế nào để Gzip nén một tập tin hiện có:

import gzip 
f_in = open('/home/joe/file.txt') 
f_out = gzip.open('/home/joe/file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

EDIT:

Jace Browning's answer sử dụng with bằng Python> = 2.7 rõ ràng là dễ hiểu hơn và có thể đọc được, vì vậy đoạn mã thứ hai của tôi sẽ (và sh Ould) trông giống như:

import gzip 
with open('/home/joe/file.txt') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out: 
    f_out.writelines(f_in) 
+0

phiên bản thứ hai có thay thế tệp gốc bằng tệp gzip, vì lệnh gzip sẽ không? Có vẻ như nó không. –

+1

@ Benoît: Vì tệp đầu ra có tên khác với tên được đọc, nên rõ ràng là nó không làm điều đó. Làm như vậy sẽ yêu cầu dữ liệu nén được lưu tạm thời ở một nơi khác cho đến khi tất cả dữ liệu trong tệp gốc đã được nén. – martineau

+0

Sử dụng gzip, tên tệp ouput khác với tên tệp đầu vào. Và nó vẫn loại bỏ các tập tin đầu vào sau khi đã tạo ra một đầu ra. Tôi chỉ đơn giản hỏi liệu mô-đun gzip python có làm điều tương tự không. –

5

Sử dụng các module gzip:

import gzip 
import os 

in_file = "somefile.data" 
in_data = open(in_file, "rb").read() 
out_gz = "foo.gz" 
gzf = gzip.open(out_gz, "wb") 
gzf.write(in_data) 
gzf.close() 

# If you want to delete the original file after the gzip is done: 
os.unlink(in_file) 

lỗi của bạn: OSError: [Errno 2] No such file or directory' đang nói với bạn rằng file fullFilePath không tồn tại. Nếu bạn vẫn cần phải đi tuyến đường đó, hãy đảm bảo rằng tệp tồn tại trên hệ thống của bạn và bạn đang sử dụng đường dẫn tuyệt đối không tương đối.

+0

Cảm ơn tất cả mọi người vì đã lặp lại nhanh chóng. Mọi người ở đây đều đề xuất gzip.I cũng đã thử cách đó.Đó là một cách tốt hơn không? Lý do tại sao tôi không sử dụng đó là nó rời tệp gốc như vậy. Tôi kết thúc bằng cả hai phiên bản-tập tin không thường xuyên và gzip. Tôi đang truy cập dữ liệu của tập tin mặc dù @ retracile, sửa chữa của bạn làm việc, cảm ơn một ton.Tôi vẫn tự hỏi nếu tôi nên sử dụng subprocess hoặc gzip. – Rinks

+1

@Rinks Cách dễ nhất để thực hiện điều đó là: Khi gzip được thực hiện, hãy gọi 'os.unlink (original_File_Name) 'để xóa tệp gốc mà bạn đã thực hiện gzip. Xem chỉnh sửa của tôi. – chown

+1

@Rinks: _Lý do tại sao tôi không sử dụng đó là nó để lại tập tin gốc như is_ - vậy tại sao bạn không xóa tập tin sau đó? – Xaerxess

28

Trong định dạng Python 2.7:

import gzip 

with open("path/to/file", 'rb') as orig_file: 
    with gzip.open("path/to/file.gz", 'wb') as zipped_file: 
     zipped_file.writelines(orig_file) 

Thậm chí ngắn hơn (Thử nghiệm trên python 2.7.6)

with open('path/to/file') as src, gzip.open('path/to/file.gz', 'wb') as dst:   
    dst.writelines(src) 
3

tài liệu về vấn đề này là thực sự điên cuồng thẳng thắn

Ví dụ về làm thế nào để đọc một tập tin nén:

import gzip 
f = gzip.open('file.txt.gz', 'rb') 
file_content = f.read() 
f.close() 

Ví dụ về làm thế nào để tạo ra một tập tin GZIP nén:

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Ví dụ về cách GZIP nén tệp hiện có:

import gzip 
f_in = open('file.txt', 'rb') 
f_out = gzip.open('file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

https://docs.python.org/2/library/gzip.html

Đó là toàn bộ tài liệu. . .

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