使用Python和Boto3从S3阅读多个CSV文件

qyuhtwio  于 2023-07-31  发布在  Python
关注(0)|答案(2)|浏览(117)

我可以在python中使用boto 3从S3 bucket中读取多个csv文件,并最终将这些文件合并到pandas中的单个dataframe中。然而,在某些文件夹中有一些空文件,导致错误“No columns to parse from file”。我们可以跳过下面代码中的空文件吗?

s3 = boto3.resource('s3')
bucket = s3.Bucket('testbucket')

prefix_objs = bucket.objects.filter(Prefix="extracted/abc")

    prefix_df = []

for obj in prefix_objs:
    key = obj.key
    body = obj.get()['Body'].read()
    temp = pd.read_csv(io.BytesIO(body),header=None, encoding='utf8',sep=',')        
    prefix_df.append(temp)

字符串
我已经使用了这个ans [https://stackoverflow.com/questions/52855221/reading-multiple-csv-files-from-s3-bucket-with-boto3][1]

pieyvz9o

pieyvz9o1#

s3 = boto3.resource('s3')
bucket = s3.Bucket('testbucket')

prefix_objs = bucket.objects.filter(Prefix="extracted/abc")

prefix_df = []

for obj in prefix_objs:
    try:
        key = obj.key
        body = obj.get()['Body'].read()
        temp = pd.read_csv(io.BytesIO(body),header=None, encoding='utf8',sep=',')        
        prefix_df.append(temp)
    except:
        continue

字符串

nnsrf1az

nnsrf1az2#

我得到了与使用相同代码的OP相同的错误。当我执行下面的代码来打印存储桶(testbucket)中的文件夹(inputfiles)中所有对象的名称时,我看到列出了3个键,尽管我只有2个对象。最后两个键列出了文件夹中的文本文件,这是我感兴趣的,而第一个键指向包含两个csv文件的文件夹。

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('testbucket')

for file in my_bucket.objects.filter(Prefix="inputfiles/"):
        print(file.key)

字符串
错误原因:“No columns to parse from file”,是for循环试图解析文件夹,而文件夹没有与之关联的“body”。当我们像下面这样使用try和exempt块时,代码会按预期执行,并打印出导致错误的键的名称。

for file in my_bucket.objects.filter(Prefix="inputfiles/"):
    try:
        body = file.get()['Body'].read()
        temp = pd.read_csv(io.BytesIO(body), encoding='utf8', sep=',')
        print(temp.head()) ## you may print or append data to a data frame 
    except:
        print(file.key) ## This will print the key that has no columns to parse
        continue

相关问题