python xlrd:使用临时文件将xls转换为csv。 Tempfile为空

问题描述:

我正在从互联网下载一个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数据库中。

我很感激帮助。谢谢。

这是完全错误的。

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