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

标签 python python-3.x csv python-babel

我正在尝试为 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'], '')

当我尝试运行提取时出现此错误:

File "/Users/tiagosilva/repos/naltio/csv_extractor.py", line 18, in extract_csv for row in reader: File "/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: iterator should return strings, not bytes (did you open the file in text mode?)

传递给函数的 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'], '')

关于python - 如何将 python csv.DictReader 与二进制文件一起使用? (对于一个babel自定义提取方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51152023/

相关文章:

Python成员函数装饰器使用实例作为参数

python - 如何使用Python 3的索引从map函数的结果中获取值?

python - Pandas 从字符串中提取数字

python - 我的 csv 中有多个列。如何使用 python 将行值与引用列匹配?

python - 如何使用 NumPy 创建一个 3 X 3 矩阵

python - 有多少人在一周中的每一天的给定时间工作,python

python - 为什么Python没有 "continue if"语句?

powershell - 导入 CSV 和 Foreach

php - 将逗号分隔值插入 MySQL 表字段

python - 如何使用 glob.glob 模块搜索子文件夹?