我正在使用 Google 云存储客户端库。
我正在尝试使用以下代码打开并处理 CSV 文件(已上传到存储桶):
filename = '/<my_bucket/data.csv'
with gcs.open(filename, 'r') as gcs_file:
csv_reader = csv.reader(gcs_file, delimiter=',', quotechar='"')
我收到错误“参数 1 必须是迭代器”以响应 csv.reader 的第一个参数(即 gcs_file)。显然 gcs_file 不支持迭代器 .next 方法。
关于如何进行的任何想法?我是否需要包装 gcs_file 并在其上创建迭代器,还是有更简单的方法?
我认为最好有自己的为 csv.reader 设计的包装器/迭代器。如果 gcs_file 支持Iterator协议,目前尚不清楚 next() 应该返回什么以始终适应其消费者。
根据 csv reader doc,它
返回一个读取器对象,它将迭代给定 csv 文件中的行。 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, ''))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)