我正在使用CSVRecordSource来读取Apache Beam管道中的CSV,该管道在read_records函数中使用open_file。
使用python 2时,一切正常,但是当我迁移到python 3时,它抱怨下面
next(csv_reader)
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
默认情况下,open_file方法以二进制模式打开文件。
所以我将其更改为使用
with open(filename, "rt") as f:
但是当我在Google云中运行数据流时,它失败了,因为它找不到文件并给出了错误消息
FileNotFoundError: [Errno 2] No such file or directory
下面是我的代码
with self.open_file(filename) as f:
csv_reader = csv.reader(f, delimiter=self.delimiter, quotechar=self.quote_character)
header = next(csv_reader)
如何在python 3中使用CSVRecordSource?
答案 0 :(得分:0)
您是否正在使用此处定义的open_file方法:https://github.com/apache/beam/blob/6f6feaaeebfc82302ba83c52d087b06a12a5b119/sdks/python/apache_beam/io/filebasedsource.py#L166?
如果是这样,我想您可以调用基础FileSystems.open()
,将'application/octet-stream'
替换为'text/plain'
。
答案 1 :(得分:0)
我通过使用iterdecode来解决它,该iterdecode迭代地解码了iterator提供的输入(字节)
csv.reader(codecs.iterdecode(f, "utf-8"), delimiter=self.delimiter, quotechar=self.quote_character)