python 3在beam.io FileBasedSource中的open_file问题

时间:2019-10-22 08:59:13

标签: python google-cloud-dataflow apache-beam apache-beam-io

我正在使用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?

2 个答案:

答案 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)