【问题标题】:Python - Copying only new files into another directoryPython - 仅将新文件复制到另一个目录
【发布时间】:2014-09-22 21:31:34
【问题描述】:

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

因此,如果我的目录 A 包含文件“1.txt、2.txt、3.txt”和目录 B 包含文件“1.txt、2.txt”,我只想将“3.txt”复制到目录 B 而不重写其他文件。

我是一名 Python 初学者,我已经为此花费了数小时并进行了大量研究,但我似乎无法找到答案!救命!

谢谢

【问题讨论】:

标签: python copying


【解决方案1】:

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

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

【讨论】:

  • 感谢您的故障。解决了我的问题并教了我方法。再次感谢。
【解决方案2】:

获取两个目录中的文件列表,您将使用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

【讨论】:

  • 只是difference。如果b_files 中有任何额外的文件,symmetric_difference 将导致问题。例如。 set(a_files).difference(b_files)
【解决方案3】:

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

【讨论】:

  • 感谢添加“*.txt”,很高兴知道!
【解决方案4】:
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

【讨论】:

    【解决方案5】:

    也许你可以做下一个:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-15
      • 2017-11-18
      • 2013-06-01
      • 2020-06-22
      • 2014-08-12
      • 2013-10-24
      • 2011-10-24
      相关资源
      最近更新 更多