【问题标题】:Python: Read CSV from S3 bucket with `import csv`Python:使用“import csv”从 S3 存储桶中读取 CSV
【发布时间】:2019-09-09 07:30:25
【问题描述】:

我目前正在尝试直接从 AWS S3 存储桶中读取 .csv。但是,我总是收到FileNotFoundError。奇怪的是,我实际上可以看到 .csv 文件的内容。

Traceback (most recent call last): File "<console>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: b',event_id,ds,yhat,yhat_lower,yhat_upper\n0,277,2019-09-04 07:14:08.051643,0.3054256311115928,0.29750667741533227,0.31441960581142636\n'

这是我的代码:

BUCKET_NAME = 'fbprophet'
FORECAST_DATA_OBJECT = 'forecast.csv'
s3 = boto3.client(
    's3',
    aws_access_key_id=settings.ML_AWS_ACCESS_KEY_ID,
    aws_secret_access_key=settings.ML_AWS_SECRET_ACCESS_KEY,
)
obj = s3.get_object(Bucket=BUCKET_NAME, Key=FORECAST_DATA_OBJECT)
data = obj['Body'].read()

with open(data, newline='') as csvfile:
    spamreader = csv.reader(io.BytesIO(csvfile), delimiter=' ', quotechar='|')
    for row in spamreader:
        print(', '.join(row))

这里是我的 .csv 文件的一些内容。理想情况下,我可以使用 row['event_id'] 将每一行作为字典访问。例如。要访问 yhat,我可以只写 row['event_id']['yhat]。但目前,它根本不是这样运作的。

    event_id    ds  yhat    yhat_lower  yhat_upper
0   277 2019-09-04 7:14:08  0.3054256311    0.2975066774    0.3144196058
0   178 2019-09-28  0.3454256311    0.2275066774    0.3944196058

【问题讨论】:

    标签: python csv amazon-s3


    【解决方案1】:

    摆脱with open(data, newline='') as csvfile:
    因为open 需要本地文件系统上的文件名。
    您应该将data 直接传递给io.BytesIO

    BUCKET_NAME = 'fbprophet'
    FORECAST_DATA_OBJECT = 'forecast.csv'
    s3 = boto3.client(
        's3',
        aws_access_key_id=settings.ML_AWS_ACCESS_KEY_ID,
        aws_secret_access_key=settings.ML_AWS_SECRET_ACCESS_KEY,
    )
    obj = s3.get_object(Bucket=BUCKET_NAME, Key=FORECAST_DATA_OBJECT)
    data = obj['Body'].read().decode('utf-8')
    spamreader = csv.reader(io.StringIO(data), delimiter=' ', quotechar='|')
    for row in spamreader:
        print(', '.join(row))
    

    编辑:显然csv.reader 需要字符串,而不是字节, 所以你需要解码响应并将数据包装在is.StringIO 中。

    【讨论】:

    • 嗨 taras,我试过了,但我收到以下错误 Traceback (most recent call last): File "&lt;console&gt;", line 1, in &lt;module&gt; _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 你知道我在哪里做错了吗?
    【解决方案2】:

    用途:

    spamreader = csv.reader(io.BytesIO(data), delimiter=',', quotechar='|')
    for row in spamreader:
        print(', '.join(row))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-29
      • 2018-06-15
      • 2019-03-22
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2019-11-12
      相关资源
      最近更新 更多