Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-仅将新文件复制到另一个目录中_Python_Copying - Fatal编程技术网

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

Python-仅将新文件复制到另一个目录中,python,copying,Python,Copying,我试图将文件从一个目录复制到另一个目录,但前提是这些文件不存在 因此,如果目录A中有文件“1.txt,2.txt,3.txt”,目录B中有文件“1.txt,2.txt”,我只想将“3.txt”复制到目录B中,而不重写其他文件 我是一个Python初学者,在这方面我花了很多时间,做了大量的研究,但我似乎找不到答案!救命啊 谢谢获取目录中的文件列表,您将使用 从两个列表中取一个差异 >>> set(a_files) - set(b_files) set(['3.txt']) 您将

我试图将文件从一个目录复制到另一个目录,但前提是这些文件不存在

因此,如果目录A中有文件“1.txt,2.txt,3.txt”,目录B中有文件“1.txt,2.txt”,我只想将“3.txt”复制到目录B中,而不重写其他文件

我是一个Python初学者,在这方面我花了很多时间,做了大量的研究,但我似乎找不到答案!救命啊


谢谢

获取目录中的文件列表,您将使用

从两个列表中取一个差异

>>> set(a_files) - set(b_files)
set(['3.txt'])
您将只获得
3.txt
将此文件复制到文件夹
B

导入shutil
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)
从操作系统导入listdir 从os.path导入isfile,加入 DIR_A=“” DIR_B=“” onlyfiles_A=[f代表listdir(DIR_A)中的f,如果isfile(join(DIR_A,f))] onlyfiles_B=[f代表listdir(DIR_B)中的f,如果isfile(join(DIR_B,f))] 对于仅文件中的f_a: 如果仅文件B中没有f_a: src=DIR_A+“/”+f_A 文件副本(src,目录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)

我会帮助你,并引导你找到答案(但我不会直接告诉你!)

因此,首先,最基本的文件编辑功能都在
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)

如果只想复制扩展名为*.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'
“*”

,请在原始目录中创建一个for循环,然后使用该循环确定文件是否已存在。如果它不复制文件。只需
差异
<如果
b_文件
中有任何额外文件,则code>symmetric_difference
将导致问题。例如,
set(a\u文件)。difference(b\u文件)
谢谢你的分解。解决了我的问题,教了我方法。再次感谢。感谢添加“*.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)