如何从 csv 中读取字节对象?

新手上路,请多包涵

我已经使用 tweepy 使用 Python 将推文文本存储在 csv 文件中 csv.writer( ),但我必须在存储之前将文本编码为 utf-8,否则 tweepy 会抛出一个奇怪的错误。

现在,文本数据存储如下:

 "b'Lorem Ipsum\xc2\xa0Assignment '"

我尝试使用此代码对此进行解码(其他列中有更多数据,文本在第 3 列中):

 with open('data.csv','rt',encoding='utf-8') as f:
    reader = csv.reader(f,delimiter=',')
    for row in reader:
        print(row[3])

但是,它不会解码文本。 I cannot use .decode('utf-8') as the csv reader reads data as strings ie type(row[3]) is 'str' and I can’t seem to convert it into bytes ,数据再次被编码!

如何解码文本数据?

编辑:这是来自 csv 文件的示例行:

 67783591545656656999,3415844,1450443669.0,b'Virginia School District Closes After Backlash Over Arabic Assignment: The Augusta County school district in\xe2\x80\xa6  | @abcde',52,18

注意:如果解决方案是在编码过程中,请注意,我负担不起再次下载整个数据。

原文由 gitmorty 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 485
2 个回答

如果您的输入文件确实包含带有 Python 语法 b 前缀的字符串,一种解决方法(即使它不是包含 csv 数据的有效格式)是使用 Python 的 ast.literal_eval() 按照@Ry 的 建议 运行——尽管我会以稍微不同的方式使用它,如下所示。

这将提供一种安全的方法来解析文件中以 b 为前缀的字符串,表明它们是字节字符串。其余的将通过不变。

请注意,这不需要将整个 CSV 文件读入内存。

 import ast
import csv

def _parse_bytes(field):
    """Convert string represented in Python byte-string literal b'' syntax into
    a decoded character string - otherwise return it unchanged.
    """
    result = field
    try:
        result = ast.literal_eval(field)
    finally:
        return result.decode() if isinstance(result, bytes) else result

def my_csv_reader(filename, /, **kwargs):
    with open(filename, 'r', newline='') as file:
        for row in csv.reader(file, **kwargs):
            yield [_parse_bytes(field) for field in row]

reader = my_csv_reader('bytes_data.csv', delimiter=',')
for row in reader:
    print(row)

原文由 martineau 发布,翻译遵循 CC BY-SA 4.0 许可协议

最简单的方法如下。试试看。

 import csv
from io import StringIO

byte_content = b"iam byte content"
content = byte_content.decode()
file = StringIO(content)
csv_data = csv.reader(file, delimiter=",")

原文由 Rakeshkumar Taninki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题