[英]How to use python csv.DictReader with a binary file? (For a babel custom extraction method)
我正在尝试为 babel 编写自定义提取方法,以从 csv 文件的特定列中提取字符串。 我按照文档here 。
这是我的提取方法代码:
def extract_csv(fileobj, keywords, comment_tags, options):
import csv
reader = csv.DictReader(fileobj, delimiter=',')
for row in reader:
if row and row['caption'] != '':
yield (reader.line_num, '', row['caption'], '')
当我尝试运行提取时,出现此错误:
文件“/Users/tiagosilva/repos/naltio/csv_extractor.py”,第 18 行,extract_csv 中的读取器行:文件“/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6 /lib/python3.6/csv.py", line 111, in next self.fieldnames File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6 /csv.py", line 98, in fieldnames self._fieldnames = next(self.reader) _csv.Error:迭代器应该返回字符串,而不是字节(你是在文本模式下打开文件吗?)
似乎传递给函数的fileobj是以二进制模式打开的。
如何使这项工作? 我可以想到 2 种可能的解决方案,但我不知道如何编码它们:
1) 有没有办法将它与 DictReader 一起使用?
2) 有没有办法让 babel 以文本模式打开文件?
我对其他未列出的解决方案持开放态度。
我真的找到了一种方法来做到这一点!
这是解决方案1,一种处理二进制文件的方法。 解决方案是在二进制文件周围包装一个 TextIOWrapper 并对其进行解码并将其传递给 DictReader。
import csv
import io
with io.TextIOWrapper(fileobj, encoding='utf-8') as text_file:
reader = csv.DictReader(text_file, delimiter=',')
for row in reader:
if row and 'caption' in row.keys():
yield (reader.line_num, '', row['caption'], '')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.