2011-01-31 11 views
3

CSVデータを配列に読み込もうとしています。私はおそらく私が英語に比べてPythonでより良いやろうとしているかを説明することができます:あなたが見ることができるように、CSVデータがないファイルで、メモリに始まりPython CSVリーダーが期待通りにCSVデータを読み取っていない

>>> line = ImportFile.objects.all().reverse()[0].file.split("\n")[0] 
>>> line 
'"007147","John Smith","100 Farley Ln","","Berlin NH 03570","Berlin","NH",2450000,"John",24643203,3454,"E","",2345071,1201,"N",15465,"I",.00,20102456,945610,20247320,1245712,"0T",.00100000,"",.00,.00,780,"D","000",.00,0\r' 
>>> s = cStringIO.StringIO() 
>>> s 
<cStringIO.StringO object at 0x9ab1960> 
>>> s.write(line) 
>>> r = csv.reader(s) 
>>> r 
<_csv.reader object at 0x9aa217c> 
>>> [line for line in r] 
[] 

。私は読者がそのデータの一部を持っていると思うだろうが、そうはしない。私は間違って何をしていますか?

答えて

5

StringIOを間違った方法で使用しています。お試しください

s = cStringIO.StringIO(line) 
r = csv.reader(s) 
next(r) 
# "['007147', 'John Smith', '100 Farley Ln', '', 'Berlin NH 03570', 'Berlin', 'NH', '2450000', 'John', '24643203', '3454', 'E', '', '2345071', '1201', 'N', '15465', 'I', '.00', '20102456', '945610', '20247320', '1245712', '0T', '.00100000', '', '.00', '.00', '780', 'D', '000', '.00', '0']" 

結果は期待どおりです。

編集:詳細を説明する:StringIOインスタンスに書き込んだ後、ファイルポインタが内容の最後を指します。これは、その後のwrite()呼び出しによって新しいコンテンツが書き込まれることを期待する場所です。しかし、これはまた、read()呼び出しが何も返さないことを意味します。最初に位置をリセットするにはs.reset()またはs.seek(0)に電話をかけるか、希望の内容でStringIOを初期化する必要があります。

+1

このようにしてもこのようになりますが、StringIOオブジェクトを読み書きする必要がある場合もあります。それはサポートされています。 – 9000

0

の後にs.seek(0)を追加します。ファイルのようなオブジェクトsの現在のポインタは、書かれた行の直前です。

関連する問題