2016-11-16 4 views
0

文字列が指定されたファイルに既に含まれているかどうかをチェックする機能があります。デュープチェック機能のエンコードエラー

関数は次のようになります。

def check_dupe(filename, word): 
    print(filename) 
    print(word) 
    with open(filename, 'rb', 0) as file, mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s: 
     if s.find(word.encode()) != -1: 
      print('dupe') 
      return True 

私は次のエラーを取得する:

<_io.TextIOWrapper name='links' mode='r' encoding='ANSI_X3.4-1968'> 
Traceback (most recent call last): 
    File "checker.py", line 277, in <module> 
    main() 
    File "checker.py", line 261, in main 
    text_links = [line.strip() for line in f if not check_dupe('completed_links', f)] 
    File "checker.py", line 261, in <listcomp> 
    text_links = [line.strip() for line in f if not check_dupe('completed_links', f)] 
    File "checker.py", line 240, in check_dupe 
    if s.find(word.encode()) != -1: 
AttributeError: '_io.TextIOWrapper' object has no attribute 'encode' 

私はこれを防ぐにはどうすればよいですか?

+0

あなた 'word'を行います。私はそれは私はあなたが実際に文字列である、代わりにパラメータとしてlineを渡すために意図を推測_io.TextIOWrapper

返します(「ファイル名」)オープンで開かれたファイルであると思いますから来た ? ( 'check_dupe()'へのパラメータとして渡されたもの)。私はそれが文字列だと思いますが、stackstraceは '_io.TextIOWrapper'であることを示しています – Guillaume

+0

その他の質問:あなたのファイルはテキストファイルかバイナリコンテンツですか?そして、あなたが 'mmap'を使う特別な理由はありますか? – Guillaume

+0

@Guillaume 100%文字列です。 'type()'でチェックしました。はい、単語が引数として渡されます。私がmmapを使用している理由は、他の方法より速いことがわかったからです。ファイルは通常のテキストファイルですが、バイナリとして読み込まれます。あなたが単語のためにファイルをチェックするためのより速い方法を持っているなら、私は提案に開いています。 – rhillhouse

答えて

0

だけstackstraceを読み取ることで、トップに下:

<_io.TextIOWrapper name='links' mode='r' encoding='ANSI_X3.4-1968'> 
Traceback (most recent call last): 
    File "checker.py", line 277, in <module> 
    main() 
    File "checker.py", line 261, in main 
    text_links = [line.strip() for line in f if not check_dupe('completed_links', f)] 
    File "checker.py", line 261, in <listcomp> 
    text_links = [line.strip() for line in f if not check_dupe('completed_links', f)] 
    File "checker.py", line 240, in check_dupe 
    if s.find(word.encode()) != -1: 
AttributeError: '_io.TextIOWrapper' object has no attribute 'encode' 

word_io.TextIOWrapperであり、あなたはその非存在encode()メソッドを呼び出すようにしてみてください。

[line.strip() for line in f if not check_dupe('completed_links', f)] 

あなたはwordのパラメータとしてfを渡し、fはあなたからあなたのラインを読んでファイルです。

wordはライン261、あなたがそこにあなたのcheck_dupe()関数に渡すパラメータです。

[line.strip() for line in f if not check_dupe('completed_links', line)] 
関連する問題