Chardet
タブ区切り形式の非常に大きなファイル(> 400万行)のエンコーディングを推測するために使用しようとしています。
現時点では、おそらくファイルのサイズが原因で、スクリプトが問題を抱えています。ファイルの最初のx行をロードするように絞り込みたいのですが、を使おうとすると問題が発生しますreadline()
。
現状のスクリプトは次のとおりです。
import chardet
import os
filepath = os.path.join(r"O:\Song Pop\01 Originals\2017\FreshPlanet_SongPop_0517.txt")
rawdata = open(filepath, 'rb').readline()
print(rawdata)
result = chardet.detect(rawdata)
print(result)
動作しますが、ファイルの最初の行のみを読み取ります。単純なループを使用してreadline()
複数回呼び出すという私の試みは、あまりうまくいきませんでした(おそらく、スクリプトがファイルをバイナリ形式で開いているという事実)。
1行の出力は {'encoding': 'Windows-1252', 'confidence': 0.73, 'language': ''}
読み取る行数を増やすと、エンコードの信頼性が向上するかどうか疑問に思いました。
どんな助けでも大歓迎です。
私はChardetに特に経験があるわけではありませんが、自分の問題をデバッグしているときにこの投稿に出くわし、答えがないことに驚いていました。これが遅すぎてOPの助けにならない場合は申し訳ありませんが、これに遭遇した他の人にとっては:
ファイルをさらに読み込むことで推測されるエンコードタイプが改善されるかどうかはわかりませんが、テストするために必要なのは次のとおりです。
import chardet
testStr = b''
count = 0
with open('Huge File!', 'rb') as x:
line = x.readline()
while line and count < 50: #Set based on lines you'd want to check
testStr = testStr + line
count = count + 1
line = x.readline()
print(chardet.detect(testStr))
私の例では、複数のエンコード形式があると思われるファイルがあり、「行ごと」にテストするために次のように記述しました。
import chardet
with open('Huge File!', 'rb') as x:
line = x.readline()
curChar = chardet.detect(line)
print(curChar)
while line:
if curChar != chardet.detect(line):
curChar = chardet.detect(line)
print(curChar)
line = x.readline()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加