Python 如何从csv读取字节对象?
我曾使用tweepy使用PythonPython 如何从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',并且我似乎无法将其转换
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=",")