我正在从互联网上下载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数据库。
我很感激帮助。谢谢。
答案 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()
,临时文件将被删除。