shutil.move的问题 - 额外\

时间:2011-02-14 20:43:01

标签: python

我有一个日志文件,在日志中,有些文件有错误,所以当文件出错时我想读取它的名字(包括路径)并将其移动到另一个目录。

我可以正确读取输入文件,例如其中一个文件是:C:\ test \ test1我可以找到该文件,我只想移动它。但是,当我使用shutil.move(filename,another_directory)时,即使打印文件名显示c:\ test1 \ test1,shutil也会在每个斜杠之前添加一个额外的'\'..也就是它试图移动C:\\ test1 \\ TEST1。 [Shutil.move通过在每个现有的'\']

中添加额外的'\'来误读输入路径

我该如何解决?谢谢!

import shutil
f=open("test_logs")
o=open("output_logs","w")
e=open("error_logs",'w')

another_directory= "C:/test"
for line in f:
    if line.lstrip().startswith("C:"):
        filename = line
        #print line
        #look for errors in the next line onwards. 
    if line.startswith("error"):
        e.write(filename + "\n")
        print filename
        shutil.move(filename,another_directory)
f.close()
o.close()

这是我得到的错误 - IOError:[Errno 2]没有这样的文件或目录:'C:\\ test \\ test1(文件是C:\ test \ test1),打印文件名显示c:\ test \ TEST1

2 个答案:

答案 0 :(得分:1)

这里有一些问题。


根据您编辑的错误消息,我看到您正在将C:/ test / test1移动到C:/ test / test1 ...这将(如果我没记错)在Windows上始终失败。尝试使用其他目标目录进行测试。


another_directory = "C:\test"

应该是“C:/ test”或使用os.path.join等。


for line in f:
    if line.lstrip().startswith("C:"):
        filename = line
        #print line
    if line.startswith("error"):
        e.write(filename + "\n")
        print filename
        shutil.move(filename,another_directory)

这两个if条件不能同时为真,所以你必须解析前一行中的文件名,然后在后面的行中检查“错误”。但是,line.lstrip()不会修改行,它只返回一个新值。将保存的值(在文件名中)写入错误日志时,您有两个换行符 - 一个仍在文件名中。然后当你移动那个文件时,它不存在,因为“filename”仍然同时包含换行符和你要关闭的任何前导空格。


another_directory= "C:/test"
filename = None
for line in f:
  if line.lstrip().startswith("C:"):
    filename = line.strip()  # Remove both leading and trailing WS.
    print "File:", filename, "(exists: %s)" % os.path.exists(filename)
  elif line.startswith("error"):
    assert filename is not None  # Do a sanity check as required.
    e.write(filename + "\n")
    print "Moving %s..." % filename
    shutil.move(filename, another_directory)

答案 1 :(得分:1)

来自shutil.move上的文档:

  

如果目的地在当前   文件系统,然后只需使用重命名。   否则,复制src(使用copy2())   到dst然后删除src。

...在这种情况下,您希望使用os.rename,因为这两个文件确实存在于同一文件系统中。而不是:

shutil.move(filename,another_directory)

执行:

directory, name  = os.path.split(filename)
os.rename(filename, os.path.join('c:', 'test', name))

从您收到的错误消息中,我们可以推测shutil.move失败,因为它希望目标文件已经存在,但它不存在。