我正在使用Twitter API下载所有用户的推文。
当我下载推文时,我会将它们编码为utf-8,然后再将它们放入CSV文件中。
from social_django.models import UserSocialAuth
user = UserSocialAuth.get_social_auth('facebook', uid).user
我正在使用python 3
问题在于,这会在我的文件中创建非常奇怪的字符。 例如,读取的推文
tweet.text.encode("utf-8")
变成
"But I’ve been talkin' to God for so long that if you look at my life, I guess he talkin' back."
(当我打开我编写此编码文本的CSV文件时,我看到了这一点。)
所以我的问题是,如何阻止这些奇怪的角色被创建。
另外,如果有人可以解释每行开始的"b""But I\xe2\x80\x99ve been talkin' to God for so long that if you look at my life, I guess he talkin' back. """
是什么意思,那将是非常有用的。
以下是完整代码:
b'
答案 0 :(得分:4)
这不是一个奇怪的角色,即RIGHT SINGLE QUOTATION MARK(U + 2019)。您通常可以在基于OSX的浏览器中完成提交中查看该字符。
如果您需要ASCII,您可以尝试:
import unicodedata
unicodedata.normalize('NFKD', tweet.text).encode('ascii','ignore')
如果将字符串编码为字节序列,然后输出该字节序列,则应该期望b"..."
指示字节序列而不是正常字符串。
答案 1 :(得分:2)
您正在使用str.encode()
,它将字符串转换为字节对象,因此字符串开头的b。
https://docs.python.org/3/library/stdtypes.html#str.encode
编辑:我无法从您提供的代码中重现UnicodeError
。以下工作对我来说很好:
import csv
class Tweet:
def __init__(self, text):
self.text = text
alltweets = [Tweet("But I’ve been talkin' to God for so long that if you look at my life, I guess he talkin' back.")]
outtweets = [ [tweet.text] for tweet in alltweets]
#write the csv
with open('test.csv', 'wt') as f:
writer = csv.writer(f)
writer.writerow(["text"])
writer.writerows(outtweets)
导致
text
"But I’ve been talkin' to God for so long that if you look at my life, I guess he talkin' back."
错误的确切位置在哪里以及哪个字符串?
答案 2 :(得分:1)
编写csv文件时必须提供正确的输出编码:
with open("tweets.csv", 'wt', encoding="utf8") as output:
writer = csv.writer(output)
writer.writerows([tweet.text] for tweet in alltweets)