2015-02-06 3 views
0

나는 이것을 question으로 보았지만 다른 것을 필요로합니다.큰 tar.gz 파일을 먼저 추출하지 않고 파이썬으로 탐색하기

내 파일에 매우 많은 양의 텍스트 파일 (수십만 개)이 변수 이름으로 구성되어 있습니다. 그래서

filename/maxvalue/IDXstation.txt  (with X that goes from 100000 to 200000) 
filename/minvalue/IDXstation.txt 
filename/meanvalue/IDXstation.txt 

과 같은 뭔가. 문제는 tar 파일에 몇 개의 폴더가 있는지 또는 파일 이름을 어떻게 지정했는지 (또는 각 폴더에 몇 개의 스테이션이 있는지) 알려주는 readme.txt 파일이 없습니다. 난 단지에 관심이 있기 때문에 나는 읽는 모든 신경 지금은 은

내가 파일을 압축 풀기 시작하기 전에 그것의 구조를 읽을 필요가
filename/maxvalue/ 
filename/minvalue/ 
filename/meanvalue/ 

같은 파일 이름 .tar.gz 및 인쇄 뭔가의 구조 일부 폴더가 아닌 모든 폴더. 내가

for tarinfo in tar: 
    print tarinfo.name 

를 사용하는 경우

그것은 모든 파일을 출력 할 것이다, 그들은 수천 수백 나는 것을 원하지 않는,하지만 난 그것을 설정하는 방법을 잘 모르겠습니다.

+0

당신이 모든 디렉토리 이름을 인쇄 하시겠습니까 아카이브? 어떤 폴더에 관심이 있습니까? – jfs

+0

예, 두 번째 레벨까지의 디렉토리 이름입니다 (의미가 있습니까?) filename/variablename/ – claire

+1

구조체를 찾는 경우 표준 명령 행 도구를 사용해야합니다. 어떤 경우이든, 데이터 스트림의 압축을 풀 필요가 없습니다. 이렇게하면,'tar' 명령은 아카이브에 "엿봄"을 가질 수있는 많은 옵션을 제공합니다. –

답변

1

이 두 번째 수준 개까지, 타르 아카이브 등의 최상위 디렉토리를 인쇄하려면 :

#!/usr/bin/env python 
import sys 
import tarfile 

with tarfile.open(sys.argv[1]) as archive: 
    for member in archive: 
     if member.isdir() and member.name.count('/') < 2: 
      print(member.name) 

사용법 :

$ print-top-level-dirs <tar-archive> 
+0

완벽하게 작동했습니다! 이것은 정말로 도움이됩니다, JF에게 감사드립니다. – claire

2

wikipedia page on tar에 보관함에있는 파일의 이름을 표시하려면 전체 보관 파일을 읽고 파일 시작 위치가이어야합니다. 따라서 파일 이름을 얻으려면 데이터 스트림을 untar해야합니다. 예상되는 이름 만 인쇄하는 간단한 방법은 정규식을 사용하여 관련 디렉토리 이름 만 유지하는 것입니다. 당신이이 충분해야처럼 자체는 타르에 등록 된 디렉토리 뭔가를 제출해야하는 경우 : 당신이 expexted 디렉토리 tar 파일에 등록되어 있는지 확실하지 않은 경우

import re 

rx = re.compile('[^/]+\/[^/]\/?$') 
... 
for tarinfo in tar: 
    if rx.match(tarinfo.name): 
     print tarinfo.name 

, 당신은 덜 엄격한 일치 넣어 사용할 수 있습니다 세트 내의 디렉토리 부분. 뭔가 같은 :

import re 

rx = re.compile('([^/]+\/[^/])\/') 
... 
names = set() 
for tarinfo in tar: 
    if rx.match(tarinfo.name): 
     names.add(tarinfo.name) 
for name in names: 
    print name 
     print tarinfo.name 
+0

나는 그것을 시도 할 것이다, 고마워. – claire

관련 문제