python 스크립트에서 tar 파일 내용을 압축 해제하지 않고 읽기


82

그 안에 많은 파일이있는 tar 파일이 있습니다. 파일의 내용을 읽고 tar 파일의 압축을 풀지 않고 전체 문자, 공백, 개행 문자, 모든 것을 포함하여 총 문자 수를 제공하는 파이썬 스크립트를 작성해야합니다.


문자 / 문자 / 공백 / 모든 것을 다른 곳으로 추출하지 않고 어떻게 셀 수 있습니까?
YOU

16
그것이 바로 질문입니다.
Erik Kaplun 2013 년

답변:


127

당신이 사용할 수있는 getmembers()

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

그런 다음을 사용 extractfile()하여 멤버를 파일 객체로 추출 할 수 있습니다 . 단지 예

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()

f위의 예제에서 파일 객체 를 사용하면 read(), readlines()등을 사용할 수 있습니다 .


17
"for member in tar.getmembers ()"는 생성기 또는 반복자 인 "for member in tar"로 변경할 수 있습니다 (어느 것인지 잘 모르겠습니다). 그러나 한 번에 하나씩 구성원을 얻습니다.
huggie

2
비슷한 문제가 있었지만 'r|'옵션을 사용했지만 tarfile 모듈이 내 램을 먹는 것 같습니다 .
devsnd

2
아. 나는 그것을 해결했다. huggie가 암시 한대로 코드를 작성한다고 가정하면 가끔 구성원 목록을 "정리"해야합니다. 따라서 위의 코드 예제가 주어지면 tar.members = []. 여기에 더 많은 정보 : bit.ly/JKXrg6
devsnd

tar.getmembers()에 넣어 때 여러 번 호출 할 수 for member in tar.getmembers()루프?
하이 펭 장

1
"f = tar.extractfile (member)"을 수행 한 후 f도 닫아야합니까?
bolei

12

tarfile 모듈을 사용해야합니다. 특히 TarFile 클래스의 인스턴스를 사용하여 파일에 액세스 한 다음 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().

대신 내용 을 읽으려면 이 방법을 사용합니다.

 |  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()

그런 다음 이렇게 구성된 인덱스를 통해 멤버에 액세스 할 수 있습니다myFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
ThorSummoner

5

@ stefano-borini가 언급 한 방법의 구현 다음과 같은 파일 이름을 통해 tar 아카이브 멤버에 액세스

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

크레딧 :


0

tarfile.list () 예를 사용할 수 있습니다.

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

이 데이터를 얻은 후. 이 출력을 파일로 조작하거나 쓸 수 있으며 요구 사항은 무엇이든 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.