【问题标题】:Encoding tweets to UTF-8 creates weird characters in Python将推文编码为 UTF-8 会在 Python 中创建奇怪的字符
【发布时间】:2017-12-20 15:12:58
【问题描述】:

我正在使用 twitter API 下载用户的所有推文。

当我下载推文时,我将它们编码为 utf-8,然后将它们放入 CSV 文件中。

tweet.text.encode("utf-8")

我正在使用 python 3

问题是这会在我的文件中创建非常奇怪的字符。 例如,读到的推文

"But I’ve been talkin' to God for so long that if you look at my life, I guess he talkin' back." 

变成了

"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. """

(当我打开写入此编码文本的 CSV 文件时,我看到了这一点)。

所以我的问题是,我怎样才能阻止这些奇怪的角色被创造出来。

另外,如果有人能解释每行开头的b' 是什么意思,那将非常有帮助。

这里是完整的代码:

    outtweets = [ [tweet.text.encode('utf-8')] for tweet in alltweets]

#write the csv  
with open('%s_tweets.csv' % screen_name, 'wt') as f:
    writer = csv.writer(f)
    writer.writerow(["text"])
    writer.writerows(outtweets)

【问题讨论】:

  • 您不必明确编码文本。这是通过文件输出编码完成的。
  • 但如果我没有明确编码,我会收到以下错误:'UnicodeEncodeError: 'ascii' codec can't encode character '\u201c' in position 1: ordinal not in range(128 )'
  • 它们可以保持编码状态。读入程序时,可以打开并指定编码方案:with open('test.csv', encoding='utf-8') as f:
  • 显示你使用的代码。
  • 我现在添加了完整的代码

标签: python csv encoding utf-8


【解决方案1】:

那不是一个奇怪的字符,那是一个RIGHT SINGLE QUOTATION MARK (U+2019)。您经常可以在基于 OSX 的浏览器完成的提交中看到该字符。

如果你需要 ASCII 来做你可以尝试的一切:

import unicodedata
unicodedata.normalize('NFKD', tweet.text).encode('ascii','ignore')

如果您将字符串编码为字节序列,然后输出该字节序列,您应该期望 b"..." 指示字节序列而不是普通字符串。

【讨论】:

  • 有没有办法让我将所有这些转换成正确的符号?
  • 为什么你认为它不是一个合适的符号。我希望您没有限制 ASCII 字符集的正确性,对吗?
  • 如果其他人阅读此答案并想知道'NFKD' 选项的作用,请参阅wiki page - 通过stackoverflow.com/a/14682498
【解决方案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."

错误究竟是在哪里引发的以及针对哪个字符串?

【讨论】:

  • 非常感谢。有没有办法去掉b?
  • 好吧,首先不对其进行编码将是可行的方法。您能否分享您的代码示例,以便我们可以看到究竟是什么导致了您的错误?只需将(默认为 UTF-8 编码的)字符串保存到 csv 就足够了。
【解决方案3】:

您必须在编写 csv 文件时提供正确的输出编码:

with open("tweets.csv", 'wt', encoding="utf8") as output:
    writer = csv.writer(output)
    writer.writerows([tweet.text] for tweet in alltweets)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多