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()
,临时文件将被删除。
非常感谢。这就像一个魅力!谢谢!! – codingknob 2013-03-17 02:06:21
问题:如果我在远离main()主体的函数中执行xls_2_csv转换,我应该在函数或main()主体中创建tempfile并将其传递给xls_2_csv函数进行操作,之后我可以返回它并分配给另一个变量?这会工作吗?我很欣赏你*最好的*编码练习建议。 :) – codingknob 2013-03-17 02:38:49
如果您询问最佳做法,我根本不会使用临时文件。我只是将文件读入数组'data = [sh.row_values(r)for r in range(sh.nrows)]'并返回数组。然后一些其他代码可以执行处理和插入。 – Tobia 2013-03-17 10:42:56