2011-01-31 175 views
3

我試圖將一些CSV數據讀入數組。我大概可以解釋什麼,我想在Python比用英語做的更好: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] 
[] 

正如你所看到的,CSV數據在內存中開始,而不是在一個文件中。我希望我的讀者能夠獲得一些這樣的數據,但事實並非如此。我究竟做錯了什麼?

回答

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 2011-01-31 21:26:51

0

s.write(line)後面加上s.seek(0)。類文件對象s中的當前指針剛剛經過寫入的行。