1

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

我很感激帮助。谢谢你。

4

1 回答 1

3

这是完全错误的:

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()它,临时文件将被删除。

于 2013-03-17T01:13:51.733 回答