UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节
Posted
技术标签:
【中文标题】UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节【英文标题】:UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte 【发布时间】:2016-11-25 20:38:45 【问题描述】:我正在尝试使用 python 2.7.12 从 json 文件中读取 twitter 数据。
我使用的代码是这样的:
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def get_tweets_from_file(file_name):
tweets = []
with open(file_name, 'rw') as twitter_file:
for line in twitter_file:
if line != '\r\n':
line = line.encode('ascii', 'ignore')
tweet = json.loads(line)
if u'info' not in tweet.keys():
tweets.append(tweet)
return tweets
我得到的结果:
Traceback (most recent call last):
File "twitter_project.py", line 100, in <module>
main()
File "twitter_project.py", line 95, in main
tweets = get_tweets_from_dir(src_dir, dest_dir)
File "twitter_project.py", line 59, in get_tweets_from_dir
new_tweets = get_tweets_from_file(file_name)
File "twitter_project.py", line 71, in get_tweets_from_file
line = line.encode('ascii', 'ignore')
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte
我查看了类似问题的所有答案,并想出了这段代码,它上次工作。我不知道为什么它现在不起作用...我将不胜感激!
【问题讨论】:
【参考方案1】:在我的情况下(mac os),我的数据文件夹中有 .DS_store 文件,这是一个隐藏的自动生成文件,它导致了问题。删除后我能够解决问题。
【讨论】:
谢谢宋!在 Mac OS 上对我来说也是同样的问题,我最终忽略了代码中的文件,因为它会被操作系统重新生成,我不确定永久删除它有多安全......跨度> 是的!谢谢!我只是添加了一个 if 语句来只读 .txt 文件,它可以工作 这里也一样,我使用的 os.listdir() 仅包含 .csv 文件,而这个 .DS_Store 正在产生问题。使用 try 和 except 轻松解决。【参考方案2】:sys.setdefaultencoding('utf-8')
对您没有帮助,这会进一步混淆事情 - 这是一个令人讨厌的 hack,您需要将其从代码中删除。
更多信息请见https://***.com/a/34378962/1554386
发生错误是因为line
是一个字符串,而您正在调用encode()
。 encode()
仅在字符串是 Unicode 时才有意义,因此 Python 尝试首先使用默认编码将其转换为 Unicode,在您的情况下为 UTF-8
,但应该是 ASCII
。无论哪种方式,0x80
都不是有效的 ASCII 或 UTF-8,因此会失败。
0x80
在某些字符集中有效。在windows-1252
/cp1252
中是€
。
这里的诀窍是在整个代码中理解数据的编码。此刻,你留给机会的机会太多了。 Unicode 字符串类型是一个方便的 Python 功能,它允许您对编码的字符串进行解码,而无需考虑编码,直到您需要写入或传输数据。
使用io
模块以文本模式打开文件并在文件运行时对其进行解码——不再需要.decode()
!您需要确保传入数据的编码是一致的。您可以在外部对其重新编码或更改脚本中的编码。这是我将编码设置为windows-1252
。
with io.open(file_name, 'r', encoding='windows-1252') as twitter_file:
for line in twitter_file:
# line is now a <type 'unicode'>
tweet = json.loads(line)
io
模块还提供通用换行符。这意味着\r\n
被检测为换行符,因此您不必注意它们。
【讨论】:
谢谢!!!我刚刚尝试过,但它不起作用 - 我正在尝试替换“windows-1252”,因为我正在使用 mac。我试过'latin-1'等。或者没关系......?感谢您的详细解释... 代码运行,但我得到数据库中所有变量的“NULL”。当我打开每个 json 文件并检查时,文件中有推文。此外,当我要求打印推文数量时,它说我有 0 条推文...... 您将需要调试您的代码并找出不工作的地方。听起来我的解决方案已经奏效,但你错过了一些东西。如果你在你的 for 循环中print tweet
会发生什么?
好的。我正在尝试调试代码...它给了我空白列表,即[ ]
。非常感谢!!
我有点困惑..我猜你的意思是当我print line
紧跟在tweet=json.loads(line)
之后?在这种情况下,什么都不会打印出来..【参考方案3】:
当您尝试阅读包含类似句子的推文时会发生错误
"@Mike http:\www.google.com \A8&^)((&() how are&^%()( you "。不能将其读取为字符串,而是您是假设将其读取为原始 String 。 但是转换为原始字符串仍然会出错,所以我建议你这样做
读取类似这样的 json 文件:
import codecs
import json
with codecs.open('tweetfile','rU','utf-8') as f:
for line in f:
data=json.loads(line)
print data["tweet"]
keys.append(data["id"])
fulldata.append(data["tweet"])
这将使您从 json 文件中加载数据。
您也可以使用 Pandas 将其写入 csv。
import pandas as pd
output = pd.DataFrame( data= "tweet":fulldata,"id":keys )
output.to_csv( "tweets.csv", index=False, quoting=1 )
然后从csv读取,避免编解码问题
希望这能帮助您解决问题。
弥敦道
【讨论】:
你在说什么“不能读取为字符串”和“必须转换为原始字符串”。 Python 中没有原始字符串这样的东西。有原始字符串 literals,但出于我希望是显而易见的原因,您不能对那些进行任何运行时转换。 嘿,当我在读取 json 文件时遇到同样的错误时,我能够通过上面的代码克服它,这就是我建议它的原因。我错了,随时欢迎您纠正我。 @MidhunMohan,谢谢!我也提到了你的代码。 不..还没有..我改变了你的代码,因为我有点困惑你所说的“tweet”和“id”是什么意思。with codecs.open(file_name,'rU','utf-8') as twitter_file:/ for line in twitter_file:/ tweet = json.loads(line)/ print line/ if u'info' not in tweet.keys():/ tweets.append(tweet)/
据此错误为ValueError: No JSON object could be decoded
。我正在尝试调试我的代码,因为代码的其他部分可能存在问题...以上是关于UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节的主要内容,如果未能解决你的问题,请参考以下文章
UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节
UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节
Django:/accounts/ProfileDetails/'utf8' 处的 UnicodeDecodeError 编解码器无法解码位置 5915 中的字节 0xe1:无效的继续字节
flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方
python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start