open_file в beam.io FileBasedSource проблема с питоном 3 - PullRequest
0 голосов
/ 22 октября 2019

Я использую CSVRecordSource для чтения CSV в конвейере Apache Beam, который использует open_file в функции read_records.

С 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)

Как я могу использовать CSVRecordSource с python 3?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я решил это, используя iterdecode, который итеративно декодирует входные данные (байты), предоставленные итератором

csv.reader(codecs.iterdecode(f, "utf-8"), delimiter=self.delimiter, quotechar=self.quote_character)
0 голосов
/ 23 октября 2019

Используете ли вы метод open_file, определенный здесь: https://github.com/apache/beam/blob/6f6feaaeebfc82302ba83c52d087b06a12a5b119/sdks/python/apache_beam/io/filebasedsource.py#L166?

Если это так, я думаю, вы можете просто вызвать базовый FileSystems.open() с 'application/octet-stream', замененным на 'text/plain'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...