Python - 仅将新文件复制到另一个目录中

时间:2014-07-31 03:33:25

标签: python copying

我尝试将文件从一个目录复制到另一个目录中,如果这些文件不存在的话。

所以,如果我的目录A包含文件" 1.txt,2.txt,3.txt"目录B包含文件" 1.txt,2.txt",我只想复制" 3.txt"进入目录B而不重写其他文件。

我是一名Python初学者,我花了好几个小时做了很多研究,但我似乎无法找到答案!救命啊!

由于

5 个答案:

答案 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)

有关更多信息,请浏览此链接:

https://docs.python.org/2/library/shutil.html

答案 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'替换为'*'