如何从csv读取字节对象?
我已经使用tweepy使用Python来将tweet的文本存储在csv文件中csv.writer(
,但是在存储之前我不得不在utf-8中对文本进行编码,否则tweepy会抛出一个奇怪的错误。
现在,文本数据存储如下:
"b'Lorem Ipsum\xc2\xa0Assignment '"
我尝试使用以下代码对此进行解码(其他列中有更多数据,文本位于第三列中):
with open('data.csv','rt',encoding='utf-8') as f:
reader = csv.reader(f,delimiter=',')
for row in reader:
print(row[3])
但是,它不会解码文本。我无法使用,.decode('utf-8')
因为csv阅读器将数据读取为字符串,即type(row[3])
is,'str'
而且我似乎无法将其转换为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
注意:如果解决方案处于编码过程中,请注意,我无力再次下载整个数据。
-
如果您的输入文件中确实包含带有Python语法
b
前缀的字符串,则解决该问题的一种方法(即使它并不是包含csv数据的真正有效格式)也可以使用ast.literal_eval
提到的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)