如何从csv读取字节对象?

git*_*rty 5 python python-3.x

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

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

"b'Lorem Ipsum\xc2\xa0Assignment '"
Run Code Online (Sandbox Code Playgroud)

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

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

但是,它不会解码文本。我不能使用,.decode('utf-8')因为 csv 阅读器将数据作为字符串读取,即type(row[3])'str',我似乎无法将其转换为bytes,数据再次被编码!

如何解码文本数据?

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

"b'Lorem Ipsum\xc2\xa0Assignment '"
Run Code Online (Sandbox Code Playgroud)

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

小智 15

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

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=",")
Run Code Online (Sandbox Code Playgroud)


mar*_*eau 6

如果您的输入文件确实包含带有 Python 语法b前缀的字符串,则解决该问题的一种方法(即使它实际上并不是要包含的 csv 数据的有效格式)是使用ast.literal_eval@Ryan 提到的Python函数,尽管我会在方式略有不同,如下图。

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

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 field


def my_csv_reader(filename, /, **kwargs):
    with open(filename, 'rt', 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)
Run Code Online (Sandbox Code Playgroud)