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. 

Я понятия не имею, где эти цифры как. Это слова, персонажи, что-то еще?

Моя цель - применить мой шаблон, как только я смогу прочитать файл строки за строкой с помощью оператора регулярных выражений.

EDIT: Вот один из моих логов

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> 

Вместо этого мы используем, как показано ниже:

for line in body.splitlines(): 

то результат выглядит следующим образом

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

C:\Users\Administrator\Desktop> 

Применения выше вещей, я попытался следующий код на текстовый файл с небольшим регулярным выражением, которое будет дайте 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

Смежные вопросы