1

データベースに挿入できるようにファイルをフォーマットしようとしています。ファイルは元々圧縮されており、約1.3MBの大きさです。各行は次のようになります。

398、%7EAnoniem + 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 = string.replace('+'、'')TypeError:バッファインターフェイスを持つオブジェクトが必要です

ここで何が悪いのか分かりますか?助けてくれてありがとう:)

4

2 に答える 2

2

問題1は、urllib.unquote_plusがlineあなたがそれを与えたものを好まないということです。メッセージは「strオブジェクトを指定してください」である必要があります:-)以下の問題2を修正し、以下を挿入することをお勧めします。

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()これを取得するには、文字列定数を使用する場合と比較すると、形式的には正しいが非実用的/異常/嘲笑可能/奇妙なタイプを呼び出すことができます''...したがって、次のようにします。

Village_Parsed = ''

問題3もあります。最後のステートメントがEOFの後にgzファイルを読み取ろうとしています。

于 2009-11-04T10:05:50.510 に答える
0
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(Uniform Resource Identifier):一般的な構文によると:

この仕様では、URI文字と、それらの文字を格納または送信するために使用されるオクテットとの間のマッピングに特定の文字エンコードを義務付けていません。URIがプロトコル要素に表示される場合、文字エンコードはそのプロトコルによって定義されます。このような定義がない場合、URIは周囲のテキストと同じ文字エンコードであると見なされます。

したがって'ascii'line.decode('ascii')フラグメントでは、テキストのエンコードに使用した文字エンコードに置き換える必要があります。

于 2009-11-04T10:39:05.010 に答える