我想移动很多文件。这些文件的路径存储在列表中。我想保留整个目录结构,但想将它们移动到另一个文件夹。
所以例如文件是 d:\测试\ test1的\ test1.txt的 d:\测试\ TEST1 \的test2.txt
我想将它们从D:\移到C:\并保留目录结构。我应该怎么做呢?
这是我的代码,它不起作用
import os, fnmatch
import shutil
f=open('test_logs.txt','r') #logs where filenames are stored with filenames as first entry
for line in f:
filename=line.split()
output_file="C:" + filename[0].lstrip("D:")
shutil.move(filename[0],output_file)
我读文件名很好,我可以很好地生成目标文件名但是当我运行它时,它给我一个错误,说“没有这样的文件或目录”(并给出输出文件名的路径)。
答案 0 :(得分:5)
我想你想要这样的东西:
import sys
import os
import shutil
# terminology:
# path = full path to a file, i.e. directory + file name
# directory = directory, possibly starting with a drive
# file name = the last component of the path
sourcedrive = 'D:'
destdrive = 'C:'
log_list_file = open('test_logs.txt', 'r')
for line in log_list_file:
sourcepath = line.split()[0] # XXX is this correct?
if sourcepath.startswith(sourcedrive):
destpath = sourcepath.replace(sourcedrive, destdrive, 1)
else:
print >>sys.stderr, 'Skipping %s: Not on %s' % (sourcepath, sourcedrive)
continue
destdir = os.path.dirname(destpath)
if not os.path.isdir(destdir):
try:
os.makedirs(destdir)
except (OSError, IOError, Error) as e:
print >>sys.stderr, 'Error making %s: %s' % (destdir, e)
continue
try:
shutil.move(sourcepath, destpath)
except (OSError, IOError, Error) as e:
print >>sys.stderr, 'Error moving %s to %s: %s' % (sourcepath, destpath, e)
如果源目录为空,是否还要删除源目录?
答案 1 :(得分:2)
更新:啊,好吧,我看到了问题 - shutil.move不会复制到不存在的目录。要执行您要执行的操作,您必须首先创建新的目录树。由于使用内置移动功能比滚动自己的复制和删除过程更安全,您可以这样做:
with open('test_logs.txt','r') as f:
files_to_copy = [line.split()[0] for line in f]
paths_to_copy = set(os.path.split(filename)[0] for filename in files_to_copy)
def ignore_files(path, names, ptc=paths_to_copy):
return [name for name in names if os.path.join(path, name) not in ptc]
shutil.copytree(src, dst, ignore=ignore_files)
for filename in files_to_copy:
output_file="C:" + filename.lstrip("D:")
shutil.move(filename, output_file)
如果不起作用,请告诉我
原始帖子:如果您只想移动部分文件,最好使用shutil.copytree
的ignore
关键字。假设您的文件列表包含完整路径和目录(即['D:\test\test1\test1.txt', 'D:\test\test1\test2.txt', 'D:\test\test1']
),请创建一个ignore_files
函数并像这样使用它:
files_to_copy = ['D:\test\test1\test1.txt', 'D:\test\test1\test2.txt', 'D:\test\test1']
def ignore_files(path, names, ftc=files_to_copy):
return [name for name in names if os.path.join(path, name) not in ftc]
shutil.copytree(src, dst, ignore=ignore_files)
然后您可以删除files_to_copy
中的文件:
for f in files_to_copy:
try:
os.remove(f)
except OSError: # can't remove() a directory, so pass
pass
我对此进行了测试 - 确保您包含要复制的路径以及files_to_copy
中的文件 - 否则,这将删除文件而不复制它们。