我使用tweepy将推文文本存储在csv文件中使用Python csv.writer(
),但我必须在存储之前用utf-8编码文本,否则tweepy会抛出一个奇怪的错误。
现在,文本数据存储如下:
"b'Lorem Ipsum\xc2\xa0Assignment '"
我尝试使用此代码对此进行解码(其他列中有更多数据,文本位于第3列):
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])
为'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
注意:如果解决方案处于编码过程中,请注意我无法再次下载整个数据。
答案 0 :(得分:3)
如果您的输入文件确实包含带有Python语法b
前缀的字符串,那么解决它的一种方法(即使它不是真正有效的csv数据格式)将使用Python的{{3函数@Ryan提到虽然我会以稍微不同的方式使用它,如下所示。
这将提供一种安全的方法来解析文件中添加了b'
字节字符串前缀的任何字符串。其余的字段将保持不变。
import ast
import csv
def _parse_bytes(field):
""" Convert string represented in Python byte-string literal syntax into a
decoded character string. Other field types returned unchanged.
"""
result = field
try:
result = ast.literal_eval(field)
finally:
return result.decode() if isinstance(result, bytes) else field
def fix_bytes(filename, delimiter=','):
with open(filename, 'rt') as f:
yield from (delimiter.join(_parse_bytes(field)
for field in line.split(delimiter))
for line in f)
filename = 'bytes_data.csv'
reader = csv.reader(fix_bytes(filename))
for row in reader:
print(row[3])
答案 1 :(得分:2)
最简单的方法如下。试试看。
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=",")
答案 2 :(得分:1)
您可以使用ast.literal_eval
安全地将不正确的字段转换回字节:
$loader = new Loader();
$loader->registerFiles('../vendor/autoload.php');