这与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文件。期望的行为是当脚本完成对函数中的行所做的操作时,它会重命名要测试的工作表。[timestamp]将其存档并查看目录以获取新工作表。
稍后代码;
os.rename('test.csv', "test." + time.strftime("%x") )
发出一个错误,即由于进程仍在使用该文件,因此无法重命名该文件。一旦完成,我该如何关闭此文件? csvfile.close()不会引发异常,如果我以交互模式单步执行代码,我可以看到csvfile是一个“已关闭的文件对象”。甚至是什么?当然一个打开的文件是一个对象,但是一个封闭的文件不是,如何让我的代码忘记这个甚至存在,所以我可以在文件上做IO?
答案 0 :(得分:2)
不适用于点。
无论如何,代码无效,因为您的函数名称错误。如果这不是故意的,那么更好地编辑它或生成代码的伪副本,而不是让我们猜测问题是什么。
要迭代,您的代码存在问题:
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()
请注意,在我的结尾,没有任何东西可以监视我的文件。防病毒已启用,并且显然未启用多线程。检查您的其他脚本是否同时监视此文件以进行更改。如果不是观看文件,而是将文件作为参数重新发送到另一个函数,而不是观看该文件,因为这可能是它正在使用的原因" 。一方面,这是我未经测试的,可能更好的是用新名称复制文件而不是重命名。
希望这有帮助。
答案 1 :(得分:0)
当您使用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阅读器访问该文件。