2017-03-09 12 views
0

これはランダムに生成されたセンテンスをディスパッチチャットに送信するスクリプトです。しかし時にはエラーになる場合があります。UnicodeDecodeError: 'ascii' codec cant decode byte 0xef in position 2141: ordinal not in range(128)UnicodeDecodeError: 'ascii'コーデックは、位置2141のバイト0xefをデコードできません:範囲内の序数(128)

どうすればこのエラーを解決できますか?

コード:

import asyncio 
import random 
import discord.ext.commands 
import markovify 
import nltk 
import re 


with open("/root/sample.txt") as f: 
text = f.read() 

class POSifiedText(markovify.Text): 
    def word_split(self, sentence): 
     words = re.split(self.word_split_pattern, sentence) 
     words = [w for w in words if len(w) > 0] 
     words = [" :: ".join(tag) for tag in nltk.pos_tag(words)] 
     return words 

    def word_join(self, words): 
     sentence = "".join(word.split("::")[0] for word in words) 
     return sentence 


text_model = POSifiedText(text, state_size=1) 

client = discord.Client() 
async def background_loop(): 
    await client.wait_until_ready() 
    while not client.is_closed: 
     channel = client.get_channel('286342556600762369') 
     messages = [(text_model.make_sentence(tries=33, max_overlap_total=10, default_max_overlap_ratio=0.5))] 
     await client.send_message(channel, random.choice(messages)) 
     await asyncio.sleep(15) 

client.loop.create_task(background_loop()) 
client.run("MjY2NjkwNDY4MjI4NzU5NTU4.C5jcdw.WFfBTUmAY7UcrwKTwYFJ9_bFHjI") 

エラーが、私は同様の問題を抱えていたライン9

+0

サンプルに非アスキー文字が含まれています。 'open()'呼び出しで、正しいエンコーディングを指定してください。 – alexis

+0

[UnicodeDecodeError: 'charmap'コーデックが重複してY位置のバイトXをデコードできません:文字はにマップされます(http://stackoverflow.com/questions/9233027/unicodedecodeerror-charmap-codec-cant-decode-byte- x-in-position-y-character) – alexis

+0

しかしあなたの質問はnltkやビルドしているチャットボットとは関係ありません。 'nltk'のすべてのタグ付けを停止します。あなたの問題を絞り、それはGoogleのソリューションに簡単になります。 – alexis

答えて

0

で発生しています。 Pythonが標準シンボルに変えられなかったアスキーコードがあることが判明しました。 これを回避するには、Pythonにasciiコードをエンコードし、エンコードできないものを無視するように指示する必要があります。それをutf-8にデコードします。

def word_split(self, sentence): 
     words = re.split(self.word_split_pattern, sentence) 
     words = [w for w in words if len(w) > 0] 
     words = [" :: ".join(tag) for tag in nltk.pos_tag(words)] 
     words = words.encode('ascii', 'ignore') 
     words = words.decode("utf-8")) 
     return words 

リターンステートメントの前に余分なステップを追加しました。

+1

**非アスキー**コードです。エンコード/デコードについては[Learn](http://stackoverflow.com/a/4546129/699305)をご覧ください。 (また、これはOPの問題を解決しません)。 – alexis

関連する問題