đọc nội dung tệp tar mà không cần giải mã nó, trong tập lệnh python


82

Tôi có một tệp tar có số tệp bên trong nó. Tôi cần viết một tập lệnh python sẽ đọc nội dung của các tệp và đưa ra tổng số ký tự, bao gồm tổng số chữ cái, dấu cách, ký tự dòng mới, mọi thứ, mà không bỏ ghi chú tệp tar.


Làm thế nào bạn có thể đếm các ký tự / chữ cái / dấu cách / mọi thứ mà không cần trích xuất chúng sang một nơi khác?
YOU

16
đó chính xác là câu hỏi được đặt ra.
Erik Kaplun

Câu trả lời:


127

bạn có thể dùng getmembers()

>>> import  tarfile
>>> tar = tarfile.open("test.tar")
>>> tar.getmembers()

Sau đó, bạn có thể sử dụng extractfile()để giải nén các thành viên dưới dạng đối tượng tệp. Chỉ là một ví dụ

import tarfile,os
import sys
os.chdir("/tmp/foo")
tar = tarfile.open("test.tar")
for member in tar.getmembers():
    f=tar.extractfile(member)
    content=f.read()
    print "%s has %d newlines" %(member, content.count("\n"))
    print "%s has %d spaces" % (member,content.count(" "))
    print "%s has %d characters" % (member, len(content))
    sys.exit()
tar.close()

Với đối tượng tệp ftrong ví dụ trên, bạn có thể sử dụng read(), readlines()v.v.


17
"cho thành viên trong tar.getmembers ()" có thể được thay đổi thành "cho thành viên trong tar", là một trình tạo hoặc một trình lặp (tôi không chắc cái nào). Nhưng nó nhận được một thành viên tại một thời điểm.
huggie

2
Tôi vừa gặp sự cố tương tự, nhưng mô-đun tarfile dường như ăn mất ram của tôi, mặc dù tôi đã sử dụng 'r|'tùy chọn.
devsnd

2
Ah. Tôi đã giải quyết nó. Giả sử bạn viết mã theo gợi ý của huggie, bạn phải "dọn dẹp" danh sách thành viên một lần. Vì vậy, với ví dụ mã ở trên, điều đó sẽ được tar.members = []. More Info ở đây: bit.ly/JKXrg6
devsnd

sẽ tar.getmembers()được gọi nhiều lần khi đặt nó trong một for member in tar.getmembers()vòng lặp?
Haifeng Zhang

1
Sau khi bạn thực hiện "f = tar.extractfile (member)", bạn có cần phải đóng cả f không?
bolei

12

bạn cần sử dụng mô-đun tarfile. Cụ thể, bạn sử dụng một phiên bản của lớp TarFile để truy cập tệp, sau đó truy cập các tên bằng TarFile.getnames ()

 |  getnames(self)
 |      Return the members of the archive as a list of their names. It has
 |      the same order as the list returned by getmembers().

Thay vào đó, nếu bạn muốn đọc nội dung , thì bạn sử dụng phương pháp này

 |  extractfile(self, member)
 |      Extract a member from the archive as a file object. `member' may be
 |      a filename or a TarInfo object. If `member' is a regular file, a
 |      file-like object is returned. If `member' is a link, a file-like
 |      object is constructed from the link's target. If `member' is none of
 |      the above, None is returned.
 |      The file-like object is read-only and provides the following
 |      methods: read(), readline(), readlines(), seek() and tell()

Lưu ý, bạn có thể truy cập vào các thành viên thông qua một chỉ số được xây dựng như vậymyFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
ThorSummoner

5

Việc triển khai các phương pháp được đề cập bởi @ stefano-borini Truy cập một thành viên lưu trữ tar thông qua tên tệp như vậy

#python3
myFile = myArchive.extractfile( 
    dict(zip(
        myArchive.getnames(), 
        myArchive.getmembers()
    ))['path/to/file'] 
).read()`

Tín dụng:


0

bạn có thể sử dụng tarfile.list () ex:

filename = "abc.tar.bz2"
with open( filename , mode='r:bz2') as f1:
    print(f1.list())

sau khi nhận được những dữ liệu này. bạn có thể thao tác hoặc ghi đầu ra này vào tệp và làm bất cứ điều gì bạn yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.