2016-07-22 206 views
4

我正在嘗試使用python 2.7.12從json文件讀取twitter數據。我用UnicodeDecodeError:'utf8'編解碼器無法解碼位置3131中的字節0x80:無效起始字節

代碼是這樣的:

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 

我通過從類似問題的所有答案,去與這個代碼走過來,它的工作最後一次。我不知道爲什麼它現在不工作...我會很感激任何幫助!

回答

9

它不會幫助你有sys.setdefaultencoding('utf-8'),這是令人困惑的事情進一步 - 這是一個討厭的黑客,你需要從你的代碼中刪除它。 瞭解更多信息

的錯誤發生,因爲line是一個字符串,你打電話encode()https://stackoverflow.com/a/34378962/1554386encode()只有在字符串是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模塊還提供Universal Newlines。這意味着\r\n被檢測爲換行符,所以您不必監視它們。

+0

謝謝!!!我只是嘗試,但它不工作 - 我試圖取代'windows-1252',因爲我正在使用mac。我嘗試了'拉丁-1'等。或者沒關係......?感謝您的詳細解釋... – wannabhappy

+0

你現在有什麼錯誤? –

+0

代碼運行但我得到數據庫中所有變量的「NULL」。 當我打開每個json文件並檢查時,文件中有tweet。另外,當我要求打印多條推文時,它說我有0條推文...... – wannabhappy

-2

當你試圖讀取包含句子鳴叫像

「@Mike HTTP出現的錯誤:\ www.google.com \ A8 & ^)((&()是如何& ^% ()(你。」這不能被理解爲一個字符串,而不是你想讀它作爲原始字符串。 但轉換爲原始字符串仍然給出錯誤,所以我更好,我建議你

讀取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閱讀,避免編碼和解碼問題

希望這將幫助你解決你的問題。

Midhun

+1

你在說什麼「不能讀爲字符串」和「必須轉換爲原始字符串」。 Python中沒有這樣的東西作爲原始字符串。有原始字符串_literals_,但你不能做任何運行時轉換爲那些我希望是顯而易見的原因。 –

+0

嘿,當我閱讀json文件時出現同樣的錯誤,我能夠通過上面的代碼克服它,這就是爲什麼我建議它。我錯了,你總是歡迎糾正我。 –

+0

@MidhunMohan,謝謝!我也提到你的代碼。 – wannabhappy

3

在我的情況下(mac os),我的數據文件夾中存在.DS_store文件,這是一個隱藏的和自動生成的文件,它引起了問題。刪除後我能解決問題。

相關問題