【问题标题】:How to open and process CSV file stored in Google Cloud Storage using Python如何使用 Python 打开和处理存储在 Google Cloud Storage 中的 CSV 文件
【发布时间】:2013-07-24 17:59:58
【问题描述】:

我正在使用 Google Cloud Storage 客户端库。

我正在尝试使用以下代码打开和处理 CSV 文件(已上传到存储桶):

filename = '/<my_bucket/data.csv'
with gcs.open(filename, 'r') as gcs_file:
    csv_reader = csv.reader(gcs_file, delimiter=',', quotechar='"')

在响应 csv.reader 的第一个参数(即 gcs_file)时,我收到错误“参数 1 必须是迭代器”。显然 gcs_file 不支持迭代器 .next 方法。

关于如何进行的任何想法?我需要包装 gcs_file 并在其上创建一个迭代器还是有更简单的方法?

【问题讨论】:

    标签: python google-app-engine google-cloud-storage


    【解决方案1】:

    我认为最好有自己的为 csv.reader 设计的包装器/迭代器。如果 gcs_file 要支持Iterator 协议,则不清楚 next() 应该返回什么以始终适应其使用者。

    根据 csv reader doc,它

    返回一个读取器对象,它将遍历给定 csvfile 中的行。 csvfile 可以是任何支持迭代器协议并在每次调用其 next() 方法时返回一个字符串的对象——文件对象和列表对象都适用。如果 csvfile 是一个文件对象,则必须在不同的平台上使用“b”标志打开它。

    它需要来自底层文件的一大块原始字节,不一定是一行。你可以有这样的包装器(未测试):

    class CsvIterator(object)
      def __init__(self, gcs_file, chunk_size):
         self.gcs_file = gcs_file
         self.chunk_size = chunk_size
      def __iter__(self):
         return self
      def next(self):
         result = self.gcs_file.read(size=self.chunk_size)
         if not result:
            raise StopIteration()
         return result
    

    关键是一次读取一个块,这样当你有一个大文件时,你不会炸毁内存或遇到 urlfetch 超时。

    甚至更简单。要使用内置的iter

    csv.reader(iter(gcs_file.readline, ''))
    

    【讨论】:

    【解决方案2】:

    试试这个:

    from StringIO import StringIO
    filename = '/<my_bucket/data.csv'
    with gcs.open(filename, 'r') as gcs_file:
        csv_reader = csv.reader(StringIO(gcs_file.read()), delimiter=',',
                                quotechar='"')
    

    但这并不理想。我已提交功能请求,要求 GCS 文件支持迭代。

    【讨论】:

    • 感谢您提交功能请求。我认为使用内置的 iter 对象效果很好。也感谢 StringIO 的想法。
    • 我建议使用更快的 cSTringIO
    猜你喜欢
    • 2021-04-18
    • 2021-01-21
    • 2014-10-12
    • 2015-10-15
    • 2017-01-24
    • 2018-07-18
    • 2021-08-11
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多