首页 > 解决方案 > os.listdir 不工作:脚本只抓取文件名而不是数据

问题描述

我目前正在编写一个将各种文件发送到 s3 存储桶的脚本。文件成功发送到存储桶没有问题,但是当我打开文件时,它们没有显示任何数据。这些文件似乎只将实际文件“名称”(.ie file1.csv)作为“字符串”传输,而不是包含任何数据的实际 .csv。

下面的示例是包含我发送到我的 s3 的文件的目录:

/home/用户/桌面/

文件 1.csv 文件 2.csv 文件 3.csv 文件 4.csv

如何更新我的代码以发送

import fnmatch
import os
import glob
import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'some_key'
ACCESS_SECRET_KEY = 'some_key'
BUCKET_NAME = 'isome_bucket'


s3 = boto3.client(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)

for file in os.listdir('/home/user/Desktop/'):
    if fnmatch.fnmatch(file, '*.csv'):

    key = "folder_1/" + file
    s3.put_object(Bucket=BUCKET_NAME, Key=key, Body=file)


print("Complete")

标签: pythoncsvamazon-s3boto3

解决方案


您只是将文件名传递给 s3。我认为 upload_file API 会比put_object 更好地为您服务。您可以简单地传递 upload_file 的完整路径,它会起作用,而不必自己打开文件并阅读内容。用这个替换你的 put_object 方法,它应该可以工作。

s3.upload_file('/home/user/Desktop/'+file, BUCKET_NAME, key)

推荐阅读