我正在尝试阅读excel中的推文。已使用python
(和tweepy
)检索推文,然后将其保存在csv
文件中:
# -*- coding: utf-8 -*-
writer= csv.writer(open(r"C:\path\twitter_"+date+".csv", "w"), lineterminator='\n', delimiter =';')
writer.writerow(["username", "nb_followers", "tweet_text"])
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token_key, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
for tweet in tweepy.Cursor(api.search, q="dengue+OR+%23dengue", lang="en", since=date, until=end_date).items():
username=tweet.user.screen_name
nb_followers=tweet.user.followers_count
tweet_text=tweet.text.encode('utf-8')
writer.writerow([username, nb_followers, tweet_text])
由于utf-8编码,我在文本编辑器或excel中读取它们时遇到问题。 例如这条推文:
在excel中给出了这个:
b"\xe2\x80\x9c@ThislsWow: I want to do this \xf0\x9f\x98\x8d http://t.co/rGfv9e70Tj\xe2\x80\x9d pu\xc3\xb1eta you're going to get bitten by the mosquito and get dengue"
如何获取原始角色?如何在开头删除b,仅在python程序中有用?
编辑:
根据Alastair McCormack的评论: 我删除了我的字段的编码并将其添加到编写器中:
writer= csv.writer(open(r"C:\path\twitter_"+date+".csv", "w", encoding="UTF-8"), lineterminator='\n', delimiter =';')
tweet_text=tweet.text.replace("\n", "").replace("\r", "")
现在我有以下错误:
tweet: Traceback (most recent call last):
File "twitter_influence.py", line 88, in <module>
print("tweet:", tweet_text)
File "C:\Users\rlalande\Envs\tweepy\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2026' in position 137: character maps to <undefined>
EDIT2:
我现在正在使用以下内容:
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
(见本文:https://stackoverflow.com/a/4374457/1875861)
没有错误但它没有输出正确的字符。
Malay Mail Online Alarming rise in dengue casesMalay Mail Online“The ministry started a campaign for construction… http://t.co/MuLFlMwkY0
之前,通过直接编码字段,我得到了:
b'Malay Mail Online\n\nAlarming rise in dengue casesMalay Mail Online\xe2\x80\x9cThe ministry started a campaign for construction\xe2\x80\xa6 http://t.co/MuLFlMwkY0'
结果不同但不是真的更好......为什么引号字符输出不正确?在一种情况下,它输出â€|,在另一种情况下输出\ xe2 \ x80 \ xa6。
答案 0 :(得分:1)
这是因为CSV编写器希望所有输入都是Unicode字符串。你得到一个字节串的__repr __()。
通过将第一行替换为:
来设置输出文件的编码writer= csv.writer(open(r"C:\path\twitter_"+date+".csv", "w", encoding="UTF-8"), lineterminator='\n', delimiter =';')
这意味着写入文件的任何Unicode字符串都将自动翻译。然后删除明确的encode()
:
tweet_text=tweet.text
修改强>
如果不使用导入功能,则需要强制Excel读取UTF-8文件。最简单的方法是将UTF-8 BOM签名添加到文件的开头。
如果您使用utf_8_sig
编码,Python会提供快捷方式。 E.g。
writer= csv.writer(open(r"C:\path\twitter_"+date+".csv", "w", encoding="utf_8_sig"), lineterminator='\n', delimiter =';')
您还可以使用Notepad ++或Atom等正确的UTF-8编辑器检查文件。