我已经使用 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)
如果您的输入文件确实包含带有 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)
| 归档时间: |
|
| 查看次数: |
15348 次 |
| 最近记录: |