質問

私はそれがデータベースに挿入することができるようにファイルをフォーマットしようとしている、ファイルが元々圧縮され、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を好きではないということです。

:メッセージは、私はあなたが以下の問題2を固定し、挿入することを示唆している:-)「strのオブジェクトを入力してください」でなければなりません
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ファイルを読み込むしようとしている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top