2017-10-21 107 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'。 –