2013-03-16 47 views
1

我正在從互聯網下載一個xls文件。它採用.xls格式,但我需要'Sheet1'以csv格式。我使用xlrd進行轉換,但似乎遇到了我寫入的文件爲空的問題?python xlrd:使用臨時文件將xls轉換爲csv。 Tempfile爲空

import urllib2 
import tempfile 
import csv 
import xlrd 

url_2_fetch = ____ 
u = urllib2.urlopen(url_2_fetch) 
wb = xlrd.open_workbook(file_contents=u.read()) 
sh = wb.sheet_by_name('Sheet1') 
csv_temp_file = tempfile.TemporaryFile() 
with open('csv_temp_file', 'wb') as f: 
    writer = csv.writer(f) 
    for rownum in xrange(sh.nrows): 
     writer.writerow(sh.row_values(rownum)) 

這似乎工作。但現在我想通過做檢查值以下:

with open('csv_temp_file', 'rb') as z: 
    reader = csv.reader(z) 
    for row in reader: 
     print row 

但我得到什麼:

>>> with open('csv_temp_file', 'rb') as z: 
...  reader = csv.reader(z) 
...  for row in reader: 
...    print row 
... 
>>> 

我使用的是臨時文件,因爲我想要做的內容的更多分析,然後使用SQLAlchemy將csv post的內容更多地解析到mySQL數據庫中。

我很感激幫助。謝謝。

回答

2

這是完全錯誤的。

csv_temp_file = tempfile.TemporaryFile() 
with open('csv_temp_file', 'wb') as f: 
    writer = csv.writer(f) 

tempfile.TemporaryFile()調用返回「可以用作臨時存儲區中的類文件對象的文件將盡快它是封閉的破壞(包括該對象被垃圾回收時隱式關閉)。

所以,你的變量csv_temp_file包含一個文件對象,已打開,您可以讀取和寫入,並會盡快調用它.close()刪除,覆蓋變量,或清理離開程序。

到目前爲止這麼好。但是,您繼續打開另一個不是臨時文件的文件with open('csv_temp_file', 'wb'),它是在腳本的當前目錄中創建的,其固定名稱爲'csv_temp_file',每次運行此腳本時都會被覆蓋,會導致安全漏洞,奇怪的錯誤和競爭條件,以及以任何方式與變量csv_temp_file無關。

您應該清除with open聲明並使用您已有的csv_temp_file變量。你可以嘗試.seek(0)它之前再次使用它的CSV閱讀器,它應該工作。當您完成它時,請撥打.close(),臨時文件將被刪除。

+0

非常感謝。這就像一個魅力!謝謝!! – codingknob 2013-03-17 02:06:21

+0

問題:如果我在遠離main()主體的函數中執行xls_2_csv轉換,我應該在函數或main()主體中創建tempfile並將其傳遞給xls_2_csv函數進行操作,之後我可以返回它並分配給另一個變量?這會工作嗎?我很欣賞你*最好的*編碼練習建議。 :) – codingknob 2013-03-17 02:38:49

+0

如果您詢問最佳做法,我根本不會使用臨時文件。我只是將文件讀入數組'data = [sh.row_values(r)for r in range(sh.nrows)]'並返回數組。然後一些其他代碼可以執行處理和插入。 – Tobia 2013-03-17 10:42:56