parse.unquote_plusはTypeError
質問
私はそれがデータベースに挿入することができるようにファイルをフォーマットしようとしている、ファイルが元々圧縮され、arroundの1.3メガバイトの大されます。 各行は次のようになります。
398%7EAnoniem + 0.001%7E、543,480,7525010,1775,0
このは、このファイルを解析する方法のコードがそのように見えます。
Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\
+'\\'+str(Newest_Date[3])+' village.gz');
Village_Parsed = str
for line in Village:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
print(Village.readline());
私はプログラムを実行すると、私はこのエラーを取得します:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
ファイル "C:\ Python31 \ libに\ urllibは\ parse.py"、行404、unquote_plusで 文字列= string.replace( '+'、 '「) TypeError例外:予想バッファインタフェースを持つオブジェクト
すべてのアイデアは、ここでは何が間違っているのですか? 任意の助けを事前に感謝:)
解決
import gzip, os, urllib.parse
archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz'
archive_path = os.path.join(Root, 'data', archive_relpath)
with gzip.open(archive_path) as Village:
Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii'))
for line in Village)
print(Village_Parsed)
出力:
398,~Anoniem 001~,543,480,7525010,1775,0
注: RFC 3986 - 統一資源識別子(URI):一般的な構文と言うの
この指定は必須ではありません。 いずれかの特定の文字エンコーディング URI文字との間のマッピングのために 格納するために使用されるオクテットか それらの文字を送信します。ときURI プロトコル要素に表示され、 文字エンコーディングはそのによって定義されます プロトコル;そのようなAなし 定義、URIはであると仮定されます 同じ文字エンコーディング 周囲のテキストます。
そこで'ascii'
フラグメントにline.decode('ascii')
は、あなたのテキストをエンコードするために使用しましたどんな文字エンコーディングに置き換える必要があります。
他のヒント
問題1 urllib.unquote_plusは、あなたがそれを与えているline
を好きではないということです。
print('line', type(line), repr(line))
すぐにfor
文の後に、あなたはline
になっているかを見ることができるようにます。
あなたはそれがオブジェクトをバイトを返すことがわかります
>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']
'R' のモードを使用すると、わずかな効果を有している:
>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']
私の代わりに解析ルーチンにline
を渡すあなたがline.decode('UTF-8')
を渡すことを示唆している...またはGZファイルが書き込まれたときに使用したものは何でもエンコーディングます。
問題2は、この行にある
Village_Parsed = str
str
がタイプです。あなたは空のstrのオブジェクトが必要です。それを取得するには、正式には正しいが非現実的であるタイプを、すなわちstr()
呼び出すことができます/珍しい/ scoffable /奇妙な文字列定数''
を使用した場合と比較したときに...ので、この操作を行います。
Village_Parsed = ''
また、問題3を持っている:あなたの最後の文は、EOFの後GZファイルを読み込むしようとしている。
。