将推文编码为UTF-8会在Python中创建奇怪的字符

时间:2017-07-15 18:03:26

标签: python csv encoding utf-8

我正在使用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'

3 个答案:

答案 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)