【问题标题】:Closing a CSV file in Python在 Python 中关闭 CSV 文件
【发布时间】:2014-08-25 05:18:24
【问题描述】:

这与 csv writer not closing file 相似或相同,但我不能 100% 确定为什么我的行为不同。

def LoadCSV:
    with open('test.csv', 'r') as csvfile:
        targetReader = csv.reader(csvfile, delimiter=',')
        for row in targetReader:
            ...

然后finally在函数中

csvfile.close()

这会以与脚本相同的方向打开 test.csv 文件。期望的行为是当脚本完成对函数中的行所做的事情时,它会重命名要测试的工作表。[timestamp] 将其归档并监视目录以获取新工作表。

后面的代码;

os.rename('test.csv', "test." + time.strftime("%x") )

由于进程仍在使用文件而导致无法重命名文件的错误。完成后如何关闭此文件? csvfile.close() 不会引发异常,如果我在交互模式下单步执行我的代码,我可以看到 csvfile 是一个“关闭的文件对象”。那是什么?一个打开的文件肯定是一个对象,但一个关闭的不是,我如何让我的代码忘记它甚至存在,以便我可以对文件执行 IO?

【问题讨论】:

  • with 块应在文件超出范围时自动关闭文件。尝试在 with 块的范围之外重命名它
  • edit:它在with块之外但在函数内部,所以它在with之外。
  • os.rename('test.csv', "test." + time.strftime("%x") ) 不依赖于 csvfile 的定义吗?
  • 重命名文件不需要文件句柄,只需要文件名。 os.rename('test.csv'.... 不需要任何定义:)
  • 这不是有效的 Python 代码:def LoadCSV:,所以请粘贴您正在使用的实际代码,而不是让我们猜测发生了什么。

标签: python csv


【解决方案1】:

不是为了积分。

代码无论如何都是无效的,因为你的函数名是错误的。如果这不是故意的,最好对其进行编辑或生成代码的伪副本,而不是让我们猜测问题所在。

要迭代,代码的问题:

  1. def LoadCSV 无效。 def LoadCSV() 是。以下截图中的证明。请注意缺少() 是如何显示语法错误标记的。

  1. 修复上面的(1),你的下一个问题是使用csvfile.close()。如果代码编写正确,一旦代码超出with 的范围,文件会自动关闭。即使代码的重命名部分在函数内部,也不应该造成任何问题。

  2. 最后的警告 - 使用格式字符串 %x 将产生类似 08/25/14 的日期字符串,具体取决于区域设置。显然,这是错误的,因为 / 在 Windows 中的文件名中无效(尝试使用此手动重命名文件)。最好是非常明确,只使用%m%d%y

最后,看看我这边的运行代码。如果您的代码不是这样的结构,那么我们无法猜测的其他错误可能会出现。

运行后结果如下:

参考代码:

import csv
import os
import time

def LoadCSV():
    with open("test.csv", "r") as csvfile:
        targetReader = csv.reader(csvfile, delimiter=",")
        for row in targetReader:
            print row
    new_name = "test.%s.csv" % time.strftime("%m%d%y")
    print new_name
    os.rename("test.csv", new_name)

LoadCSV()

请注意,在我这边,没有任何东西可以监视我的文件。防病毒已打开,并且显然没有启用多线程。检查您的其他脚本之一是否同时监视此文件以进行更改。最好不要监视文件,而是将文件作为重命名后的参数发送到另一个函数,因为这可能是它“被使用”的原因。一方面,这在我这边未经测试,可能最好用新名称复制文件而不是重命名它。

希望这会有所帮助。

【讨论】:

  • 好吧,我看错了地方,而您的第 2 点带有“警告的最后一句话”是关键,附加日期实际上是错误的。该文件没有被锁定,它正试图重命名为在 Windows 发脾气的日期带有斜线的文件。非常感谢 Nanashi
  • 很高兴知道它对您有所帮助。我对自己可以在strftime 中使用的格式字符串不太感兴趣,但是当我阅读文档并显示它基于语言环境时,我有一种预感,它要么是/,要么是@987654336 @那是让你搞砸的一部分。但是,一方面,它会引发最奇怪的错误。在您的情况下,它会引发 file being used 错误。对我来说,这是一个file cannot be found 错误。有趣的是,IO 的 Traceback 有点混乱。
【解决方案2】:

当您使用with 块时,您不需要关闭文件,它应该在范围之外释放。如果你想让 python “忘记”整个文件句柄,你可以用del csvfile 删除它。 但是由于您使用的是with,您应该删除范围内的变量。

尝试不使用with 范围:

csvfile = open('test.csv','r')
targetReader = csv.reader(csvfile, delimiter=',')
for row in targetReader:
    ....
csvfile.close()
del targetReader
os.rename('test.csv','test.'+time.strftime('%x'))

当您使用 with 块时,可能仍然是 csv 阅读器访问该文件。

【讨论】:

  • 不,文件在重命名时仍然打开。
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多