2011-11-16 3 views
2

폴더의 모든 파일을 읽고 모든 내용을 하나의 단일 파일로 출력하는 프로그램을 작성하려고합니다. 파일은 .gz 확장자로 압축됩니다. 하나의 파일을 읽을 수는 있었지만 그 파일의 나머지 부분은 읽지 못했습니다.모든 .zip 파일에 포함 된 모든 텍스트 파일과 그 내용을 Python을 사용하여 텍스트 파일에 연결하십시오.

import glob, gzip, re 
import pickle 

filed = open('Logs.txt', 'w') 


logfilenames = glob.glob('*.gz') 




logformat = re.compile(r'^\S+ \S+ \S+ \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+) .*" (\d+) (\d+) "([^"]*)" "[^"]*"') 
with gzip.GzipFile(logfilenames[0],'r') as f: 
    for i in glob.glob('*.gz'): 
     txtline = f.readline() 
     parsedline = logformat.match(txtline) 
     print "time={t} size={s} url={u}".format(t=parsedline.group(1), s=parsedline.group(5), u=parsedline.group(3)) 

     pickle.dump(["time={t} size={s} url={u}".format(t=parsedline.group(1), s=parsedline.group(5), u=parsedline.group(3))],filed) 

filed.close() 

답변

3

와 파이썬에서 사용 : 여기 내 코드입니다 정규 표현식 터치) :

import glob, gzip, re 
import cPickle 

logformat = re.compile(r'^\S+ \S+ \S+ \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+) .*" (\d+) (\d+) "([^"]*)" "[^"]*"') 

with open('Logs.txt', 'w') as f_out: 
    for i in glob.glob('*.gz'): 
     with gzip.GzipFile(i,'r') as f_in: 
      for txtline in f_in: 
       parsedline = logformat.match(txtline) 
       if parsedline: 
        f_out.write("time={t} size={s} url={u}".format(t=parsedline.group(1), s=parsedline.group(5), u=parsedline.group(3))) 
+0

감사합니다. @eumiro 폴더 내의 모든 파일을 읽습니다. 이제는 각 파일에서 한 줄만 읽습니다. –

+0

실행됩니다. AttributeError : 'NoneType'객체에 'group'속성이 없습니다. –

+0

@AdamAdamou -'parsedline'에 대한 업데이트 된 버전 확인을 참조하십시오.이 경우'AttributeError '가 수정되어야합니다. 's. 이것은 당신의 regexp에 의해 일치하지 않는 라인을 의미합니다. – eumiro

0

이 (didn를 '시도 xD.sh

mkdir dir 
mv $file dir 
cd dir 
tar -zxvf $file 
for file in `ls -w 1 | grep -v ".gz"`; do 
cat $file >> joint-file 
done 
mv joint-file ../ 
rm -rf dir 

을이 저장 한 다음

import os 
cmd = './xd.sh' 
os.system(cmd) 

=)

+0

OP는 분명히 '고양이'이상을 원합니다. 그의 정규 표현식을 보라. – eumiro

+0

제 대답은 50 % 농담입니다. 압축을 푼 후에도 일부 regexps를 적용 할 수 있습니다. 좋아하는 AWK, sed 등의 조합을 사용하십시오. –

관련 문제