这与 csv writer not closing file 相似或相同但我不能 100% 确定为什么我的行为有所不同。
def LoadCSV:
with open('test.csv', 'r') as csvfile:
targetReader = csv.reader(csvfile, delimiter=',')
for row in targetReader:
...
最后在函数中
csvfile.close()
这将按照与脚本相同的方向打开 test.csv 文件。所需的行为是当脚本对函数中的行执行完操作后,它将工作表重命名为 test.[timestamp] 以将其存档并监视新工作表到达的目录。
下面是代码;
os.rename('test.csv', "test." + time.strftime("%x") )
给出错误,指出该文件无法重命名,因为进程仍在使用该文件。完成后如何关闭该文件? csvfile.close() 不会引发异常,如果我以交互模式单步执行代码,我可以看到 csvfile 是一个“关闭的文件对象”。那到底是什么?当然,打开的文件是一个对象,但关闭的文件不是,我如何让我的代码忘记它的存在,以便我可以对文件进行 IO?
最佳答案
不是为了积分。
代码无论如何都无效,因为您的函数名称错误。如果这不是故意的,最好对其进行编辑或生成代码的伪副本,而不是让我们猜测问题是什么。
迭代一下代码的问题:
def LoadCSV
无效。def LoadCSV()
是。证明在下面的截图中。请注意缺少()
如何显示语法错误标记。
修复了上面的 (1),您的下一个问题是使用
csvfile.close()
。如果代码写得正确,一旦代码超出了with
的范围,文件就会自动关闭。即使代码的重命名部分位于函数内部,也不应该造成任何问题。最后的警告 - 使用格式字符串
%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()
请注意,在我这边,没有任何东西监视我的文件。防病毒软件已打开,并且显然没有启用多线程。检查您的其他脚本之一是否同时监视此文件的更改。最好不要查看文件,而是将文件作为重命名后的参数发送给另一个函数,因为这可能是它“被使用”的原因。一方面,这在我这边未经测试,可能更好地使用新名称复制文件而不是重命名它。
希望这有帮助。
关于python - 在 Python 中关闭 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25479416/