【问题标题】:Read csv file from S3 with Python DictReader使用 Python DictReader 从 S3 读取 csv 文件
【发布时间】:2019-09-14 00:57:02
【问题描述】:

我希望编写 Python 代码,从 S3 读取 csv 文件,然后逐行浏览文件并使用每行中的值。下面的示例来自 realpython.org,我喜欢如何使用行 [“部门”] 之类的列标题名称来选择行中的值。

我尝试将 csv.DictReader() 与从我的 S3 存储桶中获取的 csv 文件一起使用,但是当我打开文件 with open(obj['Body'], mode='r') as csv_file: 时它返回 invalid argumentTypeError: expected str, bytes or os.PathLike object, not StreamingBody

以下代码是否适用于从 S3 存储桶读取的 csv 文件?

import csv

with open('employee_birthday.txt', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        print(f'\t{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
        line_count += 1
    print(f'Processed {line_count} lines.')

【问题讨论】:

  • 您似乎正在尝试打开一个文本文档,但您使用的是 csv.DictReader - 这是您的问题。

标签: python csv amazon-s3


【解决方案1】:

obj['Body']StreamingBody 对象,如错误消息所示。由于它是一个类似文件的对象,您应该将其传递给DictReader,而不是将其作为文件路径打开,但由于它以字节为单位返回流并且DictReader 需要一个文本流,您可以将其包装起来改为io.TextIOWrapper

import io
csv_reader = csv.DictReader(io.TextIOWrapper(obj['Body']))

【讨论】:

  • 谢谢。当我这样做时,我在随后的 for 循环中收到以下错误...
  • 回溯(最近一次调用最后一次):文件“C:\test.py”,第 13 行,在 中用于 csv_reader 中的行:文件“C:\Users****\AppData \Local\Programs\Python\Python37-32\lib\csv.py”,第 111 行,在 next self.fieldnames 文件“C:\Users****\AppData\Local\Programs\ Python\Python37-32\lib\csv.py",第 98 行,在字段名中 self._fieldnames = next(self.reader) _csv.Error: iterator 应该返回字符串,而不是字节(您是否以文本模式打开文件?)
  • 谢谢,但现在这给了我一个不同的错误。
  • csv_reader = csv.DictReader(io.TextIOWrapper(obj['Body'])) AttributeError: 'StreamingBody' 对象没有属性'可读'
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多