【问题标题】:python xlrd: convert xls to csv using tempfiles. Tempfile is emptypython xlrd:使用临时文件将 xls 转换为 csv。临时文件为空
【发布时间】:2013-03-16 21:49:29
【问题描述】:

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

感谢您的帮助。谢谢。

【问题讨论】:

    标签: parsing csv xlrd


    【解决方案1】:

    这是完全错误的:

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

    【讨论】:

    • 给你的问题:如果我在远离 main() 主体的函数中执行 xls_2_csv 转换,我应该在函数中还是在 main() 主体中创建临时文件并将其传递给 xls_2_csv 函数进行操作,之后我可以将其返回并分配给另一个变量?那会奏效吗?感谢您的最佳编码实践建议。 :)
    • 如果您询问最佳实践,我根本不会使用临时文件。我只需将文件读入数组data = [sh.row_values(r) for r in range(sh.nrows)] 并返回该数组。然后其他一些代码可以进行处理和插入。
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2015-11-11
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多