python xlrd:使用tempfiles将xls转换为csv。 Tempfile为空

时间:2013-03-16 21:49:30

标签: parsing csv xlrd

我正在从互联网上下载xls文件。它是.xls格式,但我需要'Sheet1'为csv格式。我使用xlrd进行转换,但似乎遇到了我写入的文件为空的问题?

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帖子的内容存储到mySQL数据库。

我很感激帮助。谢谢。

1 个答案:

答案 0 :(得分: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变量。在使用csv阅读器再次使用它之前,您可以尝试.seek(0),它应该可以工作。完成后调用.close(),临时文件将被删除。