Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用boto3解析AWS S3中的文件_Python_Amazon S3_Boto3 - Fatal编程技术网

Python 使用boto3解析AWS S3中的文件

Python 使用boto3解析AWS S3中的文件,python,amazon-s3,boto3,Python,Amazon S3,Boto3,我试图从我的S3存储桶中读取文件,并用正则表达式模式解析它们。然而,我还没有弄清楚如何逐行读取文件。有没有一种方法可以做到这一点,或者我需要用另一种方法来进行解析 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]+(

我试图从我的S3存储桶中读取文件,并用正则表达式模式解析它们。然而,我还没有弄清楚如何逐行读取文件。有没有一种方法可以做到这一点,或者我需要用另一种方法来进行解析

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"

我在以下解决方案中使用了包含以下内容的文本文件:

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

请检查我下面的答案。谢谢你的评论。我想我现在对我的正则表达式有意见了。如果我尝试r'pattern,我会得到错误“不能在类似字节的对象上使用字符串模式”。如果我使用b'pattern',我会得到“正则表达式的意外结束”,这个模式就是我的问题。谢谢,我来看看。您可以在您编写的regex文件中共享示例数据吗?您想从行中提取哪些信息?好的。谢谢您提供的信息。让我检查一下。