2016-09-01 5 views
3

S3 버킷에서 파일을 읽으려고하고 정규식 패턴으로 파싱하려고합니다. 그러나, 나는 한 줄씩 파일을 읽는 것을 알아낼 수 없었다. 이 작업을 수행하는 방법 또는 구문 분석을 위해이 작업을 수행하는 다른 방법이 있습니까?AWS S3에서 boto3을 사용하여 파일 구문 분석

pattern = '^(19|20)\d\d[-.](0[1-9]|1[012])[-.](0[1-9]|[12][0-9]|3[01])[ \t]+([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9][ \t]+(?:[0-9]{1,3}\.){3}[0-9]{1,3}[ \t]+(?:GET|POST|PUT)[ \t]+([^\s]+)[ \t]+[1-5][0-9][0-9][ \t]+(\d+)[ \t]+(\d+)[ \t]+"(?:[^"\\]|\\.)*"[ \t]+"(?:[^"\\]|\\.)*"[ \t]+"(?:[^"\\]|\\.)*"' 

s3 = session.resource('s3') 
bucket_name = s3.Bucket(bucket) 
data = [obj for obj in list(bucket_name.objects.filter(Prefix=prefix)) if obj.key != prefix] 

for obj in data: 
    key = obj.key 
    body = obj.get()['Body'].read() 
    print(key) 
    print(body) 
    for line in body: 
     print(line) 

그래서 올바른 파일을 볼 수 있으며 파일의 전체 본문을 읽을 수 있습니다 (IIS 로그와 유사). 그러나 선을 반복 할 때 숫자가 표시됩니다. 따라서 print(line)의 출력은

35 
101 
119 
147 
etc. 

이 번호의 출처는 알 수 없습니다. 그들은 단어, 인물, 다른 것입니까?

제 목표는 파일을 정규식 연산자로 한 줄씩 읽을 수있게되면 패턴을 적용하는 것입니다.

편집 : 저는 여기에 솔루션 아래에 사용하고 아래 내용

2016-06-14 14:03:42 1.1.1.1 GET /origin/ScriptResource.axd?=5f9d5645 200 26222 0 "site.com/en-US/CategoryPage.aspx" "Mozilla/5.0 (Linux; Android 4.4.4; SM-G318HZ Build/KTU84P)" "ASP.NET_SessionId=emfyTVRJNqgijw=; __SessionCookie=bQMfQzEtcnfMSQ==; __CSARedirectTags=ABOcOxWK/O5Rw==; dtCookie=B52435A514751459148783108ADF35D5|VVMrZVN1aXRlK1BXU3wx" 
+1

내 대답을 확인하십시오. –

답변

2

텍스트 파일 내 로그 라인 중 하나입니다

:

I love AWS. 
I love boto3. 
I love boto2. 

나는 문제가 줄 생각

for line in body: 

줄 단위가 아닌 문자 단위로 반복됩니다.

C:\Users\Administrator\Desktop>python bt.py 
I 

l 
o 
v 
e 

A 
W 
S 
. 



I 

l 
o 
v 
e 

b 
o 
t 
o 
3 
. 



I 

l 
o 
v 
e 

b 
o 
t 
o 
2 
. 

C:\Users\Administrator\Desktop> 

는 대신에 우리는 다음과 같이 사용이

C:\Users\Administrator\Desktop>python bt.py 
I love AWS. 
I love boto3. 
I love boto2. 

C:\Users\Administrator\Desktop> 

이 무엇보다도 적용과 같은

for line in body.splitlines(): 

다음 출력이 보이는, 내가하는 것입니다 작은 정규식과 텍스트 파일에 아래의 코드를 시도 파일에서 boto 버전을 제공하십시오.

import re 
header = ['Date', 'time', 'IP', 'method', 'request', 'status code', 'bytes', 'time taken', 'referrer', 'user agent', 'cookie'] 
s3 = session.resource('s3') 
bucket_name = s3.Bucket(bucket) 
data = [obj for obj in list(bucket_name.objects.filter(Prefix=prefix)) if obj.key != prefix] 

for obj in data: 
    key = obj.key 
    body = obj.get()['Body'].read() 
    #print(key) 
    #print(body) 
    x=0 
    for line in body: 
     m = re.search(r'(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})\s+([\d\.]+)\s+([GET|PUT|POST]+)\s+([\S]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+([\S]+)\s+(\".*?\")\s+(.*)',line) 
     if m is not None: 
      for i in range(11): 
       print header[i]," - ",m.group(x) 
       x+=1 
     print "------------------------------------" 
     x=0 
+0

Dinesh 주석 주셔서 감사합니다. 지금 내 정규 표현식에 문제가 있다고 생각합니다. r'pattern '을 시도하면 "바이트와 같은 객체에 문자열 패턴을 사용할 수 없습니다"라는 오류가 발생합니다. b'pattern을 사용하면 "예기치 않은 정규식 종료"패턴이 내 질문에 있습니다. 감사합니다 – maltman

+1

보세요. 정규식을 작성한 파일의 샘플 데이터를 공유 할 수 있습니까? –

+0

질문에 그냥 추가했습니다. – maltman

관련 문제