我尝试将文件从一个目录复制到另一个目录中,如果这些文件不存在的话。
所以,如果我的目录A包含文件" 1.txt,2.txt,3.txt"目录B包含文件" 1.txt,2.txt",我只想复制" 3.txt"进入目录B而不重写其他文件。
我是一名Python初学者,我花了好几个小时做了很多研究,但我似乎无法找到答案!救命啊!
由于
答案 0 :(得分:2)
我会帮助你,并引导你回答(但我不会直接把它给你!)。
首先,首先,大多数基本文件编辑功能都在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)
答案 1 :(得分:1)
获取两个目录中的文件列表,您将使用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'])
U只会3.txt
将此文件复制到文件夹B
答案 2 :(得分:0)
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)
有关更多信息,请浏览此链接:
答案 3 :(得分:0)
也许你可以做下一个:
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)
答案 4 :(得分:0)
如果您只想复制扩展名为* .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'
替换为'*'