Python - 仅复制新文件到另一个目录
我想把一个文件夹里的文件复制到另一个文件夹里,但前提是这些文件在目标文件夹里还不存在。
比如说,我有一个文件夹A,里面有“1.txt、2.txt、3.txt”这几个文件,而文件夹B里有“1.txt、2.txt”这两个文件。我只想把“3.txt”复制到文件夹B里,而不想覆盖掉其他文件。
我刚开始学Python,花了好几个小时在这上面,查了很多资料,但就是找不到解决办法!求助!
谢谢
5 个回答
import shutil
from os import listdir
from os.path import isfile, join
DIR_A = "<Complete path to A directory>"
DIR_B = "<Complete path to B directory>"
onlyfiles_A = [ f for f in listdir(DIR_A) if isfile(join(DIR_A,f)) ]
onlyfiles_B = [ f for f in listdir(DIR_B) if isfile(join(DIR_B,f)) ]
for f_a in onlyfiles_A:
if not f_a in onlyfiles_B:
src = DIR_A+"/"+f_a
shutil.copy(src, DIR_B)
想了解更多信息,可以查看这个链接:
也许你可以试试下面这个:
import glob
import shutil
src = "/opt/"
dst = "/opt/something/"
files_src = set(glob.glob(src+"*.txt"))
files_dst = set(glob.glob(dst+"*.txt"))
other_files = files_src-files_dst
for _file in other_files:
shutil.copy(src+_file, dst)
如果你只想复制扩展名为*.txt的文件,可以这样做:
#!/usr/bin/python
import glob
import os
import shutil
dira = 'path-to-dira'
dirb = 'path-to-dirb'
for filename in glob.glob(os.path.join(dira,'*.txt')):
print os.path.join(dirb,os.path.basename(filename))
if not os.path.isfile(os.path.join(dirb,os.path.basename(filename))):
shutil.copy(filename,dirb)
如果你想复制所有文件,把'*.txt'
换成'*'
就可以了。
获取两个文件夹里的文件列表,你可以使用 os.listdir
这个方法。
>>> a_files = ['1.txt', '2.txt', '3.txt']
>>> b_files = ['1.txt', '2.txt']
然后对这两个列表进行比较。
>>> set(a_files) - set(b_files)
set(['3.txt'])
你会发现只有 3.txt
这个文件,把它复制到文件夹 B
里。
我来帮你,带你找到答案(但我不会直接告诉你!)
首先,最基本的文件编辑功能都在 os
模块里,所以我们先在脚本的开头导入这个模块:
import os
接下来,我们来看看怎么检查一个文件是否存在。[稍微查一下发现 os.path
模块里有个叫 exists
的函数,可以用来检查文件是否存在!] 现在我们准备好了,但还需要弄清楚怎么获取目录A里的所有文件。看起来 os
模块也能做到这一点,使用 listdir
函数。如果我们有一个叫“directoryone”的目录,我们可以用这个方法获取里面的所有文件和目录(然后把它们放到一个列表里):
[file for file in os.listdir("directoryone")]
不过我们只想获取文件,所以需要加一个 if
语句来缩小我们的列表范围:
[file for file in os.listdir("directoryone") if os.path.isfile(os.path.join("directoryone", f))]
现在我们有了一个语句,可以获取目录里的所有文件,并且有了检查文件是否存在的方法。最后一件事就是弄清楚怎么复制文件。为此我们需要导入 shutil
模块:
import shutil
然后我们可以这样使用 shutil.copy
函数:
shutil.copy(srcfile, dstdir)
所以我们最终会得到这样的代码:
import os, shutil
directorya = "exampledir"
directoryb = "exampledir2"
files = [file for file in os.listdir(directorya) if os.path.isfile(os.path.join(directorya, file))]
for file in files:
if not os.path.exists(os.path.join(directoryb, file)):
shutil.copy(os.path.join(directorya, file), directoryb)