2017-10-21 142 views
0

我有一個運行代碼使用tweepy的流偵聽器來流推文。它工作得很好,我已經成功運行了幾次,都使用了阿拉伯文,英文和法文關鍵字。Streaming AP:跟蹤關鍵字導致「錯誤:非UTF-8代碼...但沒有聲明的編碼」

出於某種原因,當我插入我的整個組關鍵字(397)錯誤代碼導致讀取

SyntaxError: Non-UTF-8 code starting with '\xd9' in file twitter_streaming_copy.py on line 67, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 

很奇怪的是,我試圖運行使用該組的不同部分的代碼關鍵字,它工作正常,只有當我把它們放在一起,停止工作。任何想法?這裏是我的代碼:(我使用python 3)

# Chap02-03/twitter_streaming.py 
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys 
import string 
import time 
import tweepy 
from tweepy import Stream 
from tweepy.streaming import StreamListener 
consumer_key = ".." 
consumer_secret = ".." 
access_key = ".-." 
access_secret = ".." 


class CustomListener(StreamListener): 
    """Custom StreamListener for streaming Twitter data.""" 

    def __init__(self, fname): 
    safe_fname = format_filename(fname) 
    self.outfile = "stream_%s.jsonl" % safe_fname 

    def on_data(self, data): 
    try: 
     with open(self.outfile, 'a') as f: 
     f.write(data) 
     return True 
    except BaseException as e: 
     sys.stderr.write("Error on_data: {}\n".format(e)) 
     time.sleep(5) 
    return True 

    def on_error(self, status): 
    if status == 420: 
     sys.stderr.write("Rate limit exceeded\n") 
     return False 
    else: 
     sys.stderr.write("Error {}\n".format(status)) 
     return True 

def format_filename(fname): 
    """Convert fname into a safe string for a file name. 

    Return: string 
    """ 
    return ''.join(convert_valid(one_char) for one_char in fname) 

def convert_valid(one_char): 
    """Convert a character into '_' if "invalid". 

    Return: string 
    """ 
    valid_chars = "-_.%s%s" % (string.ascii_letters, string.digits) 
    if one_char in valid_chars: 
    return one_char 
    else: 
    return '_' 

if __name__ == '__main__': 
    query = sys.argv[1:] # list of CLI arguments 
    query_fname = ' '.join(query) # string 
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_key, access_secret) 
    api = tweepy.API(auth) 
    twitter_stream = Stream(auth, CustomListener(query_fname)) 
    twitter_stream.filter(track=['saudi لبنان', 'iran لبنان', 'iran lebanon', 'ايران لبنان', 'hezbollah lebanon', 'حزب الله لبنان', 'saoudite liban', 'iran liban', 'hezbollah liban'], async=True) 
+0

請勿在發佈時手動縮進您的線條。複製代碼並粘貼到問題中,選擇代碼,然後使用工具欄按鈕縮進它。您現在在整個代碼中都會出現奇怪的無效縮進。 –

+0

謝謝你的建議 –

回答

0

您沒有保存源文件爲UTF-8。正確配置您的編輯器。

或者,在頂部調整您的編碼註釋; Python 3的默認值是UTF-8,但如果您使用了不同的編解碼器,則需要在該評論中指定它。但是,編碼註釋應該出現在您的文件的第一個兩個。你有它在第三行。從PEP linked in the error message報價:

To define a source code encoding, a magic comment must be placed into the source files either as first or second line in the file[.]

(粗體重點煤礦)

重新安排你的意見:

​​

我感動的第一個註釋下降; #!必須是文件中的第一行才能工作。你也可以完全刪除它,因爲你沒有使用它。

+0

謝謝,我完全忽略了這一點。但正如所提到的,代碼本身即使使用阿拉伯語關鍵字也能工作。我刪除了兩個單詞(我沒有在上面的代碼中列出400個關鍵字),因爲這兩個單詞具有特定的功能:إ和أ,儘管這些是正常的阿拉伯字母,但似乎python在識別它們時遇到了問題。沒有這兩個流的工作很好......但感謝您的幫助! –

+0

@JosephinaK .:這兩個碼點沒有什麼特別之處。也許你在一個地方處理組成的角色並在另一個地方分解?這兩個碼點都可以與U + 0654或U + 0655(阿拉伯語的HAMZA ABOVE和BELOW)一起分解爲U + 0627 ARABIC LETTER ALEF。請參閱[正常化Unicode](// stackoverflow。com/q/16467479)如何在兩種形式之間進行轉換。 –

0

我通過將文件保存爲Windows-1256(阿拉伯語)再現與下面的代碼類似的錯誤:

# Chap02-03/twitter_streaming.py 
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
s = ['saudi لبنان', 'iran لبنان', 'iran lebanon', 'ايران لبنان', 'hezbollah lebanon', 'حزب الله لبنان', 'saoudite liban', 'iran liban', 'hezbollah liban'] 

輸出:

File "C:\test.py", line 4 
SyntaxError: Non-UTF-8 code starting with '\xe1' in file C:\test.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 

@馬亭的答案是正確的,因爲coding行必須是在前兩行中,但UTF-8無論如何都是Python 3中的默認編碼。如果文件以UTF-8格式保存,即使對錯誤行的評論也可以正常工作,但文件也必須保存在聲明的編碼中。

+0

錯誤顯示它們獲得0xd9字節,而不是0xe1字節,因此使用的實際編解碼器不同。 –

+0

@martijn我知道,這就是爲什麼我說「類似的錯誤」:^)我嘗試的阿拉伯語遺留編碼沒有一個給出了確切的錯誤。 –

+0

事實上,正好有0個編解碼器會爲該文本生成'\ xd9'。 –