繁体   English   中英

如何将 python csv.DictReader 与二进制文件一起使用? (对于 babel 自定义提取方法)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM