2

私は現在、(検索エンジンから)ログファイルのリストを取得し、後で分析するために、これらの中にすべてのクエリを含むファイルを生成するPythonスクリプトに取り組んでいます。スクリプトのもう1つの機能は、私も実装した最も一般的な単語を削除することですが、克服できないと思われる問題に直面しました。クエリに特殊文字が含まれていない限り、単語の削除は意図したとおりに機能します。検索ログはデンマーク語であるため、文字æ、ø、åが定期的に表示されます。

トピックを検索すると、これらをUTF-8にエンコードする必要があることがわかりました。これは、クエリを取得するときに実行しています。

tmp = t_query.encode("UTF-8").lower().split()

t_queryはクエリであり、後で各単語を禁止されている単語のリストと比較するために分割します。エンコーディングを使用しない場合、エラーが発生します。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 1: ordinal not in range(128)

編集:代わりにデコードを使用しようとしましたが、次のエラーが発生します:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa7' in position 3: ordinal not in range(128)

私はこのような言葉をループします:

for i in tmp:
    if i in words_to_filter:
        tmp.remove(i)

前述のように、これは特殊文字を含まない単語に対して完全に機能します。現在禁止されている単語と一緒にiを印刷しようとしましたが、次のようになります。

færdelsloven - færdelsloven

ここで、最初の単語はtmpのi番目の要素です。禁じられた言葉の最後の言葉。明らかに何かがうまくいかなかったが、私は解決策を見つけることができなかった。私はグーグルとここで見つけた多くの提案を試しましたが、今のところ何もうまくいきませんでした。

編集2:違いが生じる場合は、コーデックを使用する場合と使用しない場合の両方でログファイルをロードしてみました。

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())

重要な場合は、Windows環境からPython2.7.2を実行しています。スクリプトは、他のプラットフォーム(つまり、LinuxおよびMac OS)で実行できる必要があります。

誰かが私を助けてくれたら本当にありがたいです。

よろしくキャスパー

4

4 に答える 4

4

あなたがファイルを読んでいるなら、あなたはdecodeそれらを読みたいです。

tmp = t_query.decode("UTF-8").lower().split()
于 2012-12-20T12:57:59.323 に答える
0

1行にjsonオブジェクトを含むutf-8ファイルを指定すると、すべてのオブジェクトを読み取ることができます。

with open(filename) as file:
    jlogs = [json.loads(line) for line in file]

埋め込まれた改行処理を除いて、上記のコードはあなたと同じ結果を生成するはずです:

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())

この時点で、のすべての文字列jlogsはUnicodeであり、「特殊」文字を処理するために何もする必要はありません。コードにバイトとUnicodeテキストが混在していないことを確認してください。

  • バイトからUnicodeテキストを取得するには:some_bytes.decode(character_encoding)
  • Unicodeテキストからバイトを取得するには:some_text.encode(character_encoding)

バイトをエンコード/Unicodeをデコードしないでください。

于 2012-12-21T10:15:39.077 に答える
0

エンコーディングが正しく、予期しない文字を無視したい場合errors='ignore'、またはerrors='replace'パラメータがcodecs.open関数に渡された場合。

with codecs.open(file_name, encoding='utf-8', mode='r', errors='ignore') as f:
    jlogs = map(json.loads, f.readlines())

ドキュメントの詳細:http: //docs.python.org/2/howto/unicode.html#reading-and-writing-unicode-data

于 2012-12-21T13:55:32.567 に答える
-1

私はついにそれを解決しました。Lattyware Python 3.xの方がはるかに優れているようですが、バージョンを変更し、PythonファイルをUnicodeにエンコードすると、意図したとおりに機能します。

于 2013-01-02T11:18:45.153 に答える