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

Python 如何从csv读取字节对象?,python,python-3.x,Python,Python 3.x,我曾使用tweepy使用Pythoncsv.writer()将tweets文本存储在csv文件中,但我必须在存储之前将文本编码为utf-8,否则tweepy会抛出一个奇怪的错误 现在,文本数据存储如下: "b'Lorem Ipsum\xc2\xa0Assignment '" 我试图用这段代码来解码(其他列中有更多数据,文本在第3列中): 但是,它不能解码文本。我无法使用.decode('utf-8'),因为csv阅读器将数据读取为字符串,即类型(第[3]行)是'str',并且我似乎无法将其转换

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

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

"b'Lorem Ipsum\xc2\xa0Assignment '"
我试图用这段代码来解码(其他列中有更多数据,文本在第3列中):

但是,它不能解码文本。我无法使用
.decode('utf-8')
,因为csv阅读器将数据读取为字符串,即
类型(第[3]行)
'str'
,并且我似乎无法将其转换为
字节
,数据将再次编码

如何解码文本数据

编辑:以下是csv文件中的示例行:

6778359154566569993415844450443669.0,弗吉尼亚学区因阿拉伯语作业遭到强烈反对而关闭:奥古斯塔县学区位于\xe2\x80\xa6 |@abcde',52,18

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

如果您的输入文件确实包含带有Python语法前缀的字符串
b
,一种解决方法(即使它不是csv数据真正包含的有效格式)将使用前面提到的Python函数@Ryan,尽管我将以稍微不同的方式使用它,如下所示

这将提供一种安全的方法来解析文件中前缀为
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)
您可以使用将不正确的字段安全地转换回字节:

import ast


def _parse_bytes(bytes_repr):
    result = ast.literal_eval(bytes_repr)

    if not isinstance(result, bytes):
        raise ValueError("Malformed bytes repr")

    return result

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

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=",")

如果在文本编辑器中打开文件,请至少显示文件中显示的完整行。如果没有您的代码和数据,我们无法重现您的问题。对不起。我增加了一个例子。将该行保存在扩展名为.csv的文件中。因此,csv文件中的字符串实际上是用前缀
b
表示的,如
b'Virginia…
?无论产生什么,csv都会被破坏,应该修复。谢谢。这确实解决了上述问题,但我觉得使用eval()并不舒服。Gitmoty:我认为@Ryan使用
ast.literal\u eval()
而不是
eval()
的想法是一个好主意,并将基本想法纳入了我自己的答案中,我认为这解决了您在评论中提到的两个问题。
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=",")