在Python中关闭CSV文件

时间:2014-08-25 05:18:24

标签: python csv

这与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?

2 个答案:

答案 0 :(得分:2)

不适用于点。

无论如何,代码无效,因为您的函数名称错误。如果这不是故意的,那么更好地编辑它或生成代码的伪副本,而不是让我们猜测问题是什么。

要迭代,您的代码存在问题:

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

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

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

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

      enter image description here

      运行后的结果如下:

      enter image description here

      参考代码:

      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阅读器访问该文件。