将.txt文件中名称匹配的文件从一个文件夹复制到另一个文件夹

时间:2019-07-25 12:37:12

标签: python r shell

我想根据--network="host" 文件中的匹配文件名将文件从一个大文件夹复制到另一个文件夹。

我的.txt文件包含文件名:

list.txt

和另一个大文件夹包含许多ex文件。 S001 S002 S003

我只想从这个大文件夹中复制与我的S001, S002, S003, S004, S005文件中的文件名匹配的文件。

我已经尝试过Bash,Python-无法正常工作。

list.txt

也不起作用。

我在Python中的逻辑无法正常工作:

for /f %%f in list.txt do robocopy SourceFolder/ DestinationFolder/ %%f

在Bash,Python或R中有答案吗?

谢谢

4 个答案:

答案 0 :(得分:0)

我认为您的Python代码的问题在于,使用os.walk()时,您的filename每次都会是一个列表,在您的filenames_to_copy中找不到该列表。

我建议您尝试使用os.listdir(),因为它将以字符串形式返回文件名/文件夹名称的列表-可以更轻松地与filenames_to_copy进行比较。

其他说明-也许您想在源而不是目标上执行os.listdir()(或os.walk())。当前,如果文件已存在于目标中,则仅将文件从源复制到目标。

答案 1 :(得分:0)

os.walk()将返回一个由三个元素组成的元组:被检查的当前目录的名称,其中的文件夹列表以及其中的文件列表。您只对后者感兴趣。因此,您应该使用以下方法进行迭代:

for _, _, filenames in os.walk(destination):

JezMonkey指出,os.listdir()更易于使用,因为它将列出所请求目录中的文件和文件夹。但是,您将失去os.walk()启用的递归搜索。如果您所有文件都在同一文件夹中而不是隐藏在某些文件夹中,则最好使用os.listdir()

我在您的代码中看到的第二个问题是,当我认为您想复制source时,您复制了os.path.join(source, filename)

您能否发布与Python脚本有关的确切错误,以便我们更好地为您提供帮助。

更新

您实际上不需要列出源文件夹中的所有文件。使用os.path.exists,您可以检查文件是否存在并复制文件。

import os
import shutil

def main():
    destination = "DestinationFolder/copy"
    source = "SourceFolder/MyBigData"

    with open("list.txt", "r") as lines: # adapt the name of the file to open to your exact location.
        filenames_to_copy = set(line.rstrip() for line in lines)

    for filename in filenames_to_copy:
        source_path = os.path.join(source, filename)
        if os.path.exists(source_path):
            print("copying {} to {}".format(source_path, destination))
            shutil.copy(source_path, destination)

答案 2 :(得分:0)

您可以尝试以下代码-

import glob

big_dir = "~\big_dir"
copy_to = "~\copy_to"
copy_ref = "~\copy_ref.txt"

big_dir_files = [os.path.basename(f) for f in glob.glob(os.path.join(big_dir, '*'))]
print 'big_dir', big_dir_files # Returns all filenames from big directory

with open(copy_ref, "r") as lines:
    filenames_to_copy = set(line.rstrip() for line in lines)
    print filenames_to_copy   # prints filename which you have in .txt file

    for file in filenames_to_copy:
        if file in big_dir_files:   # Matches filename from ref.txt with filename in big dir
            file_to_copy = os.path.join(big_dir, file)
            copy_(file_to_copy, copy_to)

def copy_(source_dir, dest_dir):
    files = glob.iglob(os.path.join(source_dir, '*'))
    for file in files:
        dest = os.path.join(dest_dir, os.path.basename(os.path.dirname(file)))
        if not os.path.exists(dir_name):
            os.mkdir(dest)
        shutil.copy2(file, dest)

参考:

https://docs.python.org/3/library/glob.html

答案 3 :(得分:0)

感谢@PySaad和@Guillaume所做的贡献,尽管我的脚本现在正在运行:我添加了:

             if os.path.exists(copy_to):
            shutil.rmtree(copy_to)
            shutil.copytree(file_to_copy, copy_to)

该脚本及其工作方式很吸引人:)

非常感谢您的帮助!