我有一个日志文件,在日志中,有些文件有错误,所以当文件出错时我想读取它的名字(包括路径)并将其移动到另一个目录。
我可以正确读取输入文件,例如其中一个文件是: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
答案 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
失败,因为它希望目标文件已经存在,但它不存在。