【问题标题】:Selectively copy files from one folder directory to another有选择地将文件从一个文件夹目录复制到另一个
【发布时间】:2019-08-28 07:39:47
【问题描述】:

我有一个目录树,其中文件夹的名称很重要。我也有一个来自folder1>folder2>folder3>foo.txt的csv说。 folder1,folder2,folder3 和 txt 都在 csv 的不同列中。我需要保持目录结构不变并复制 csv 中给出的文件。

我正在尝试的方法是复制目录树并编写 python 代码来删除不需要的文件。所以有很多循环,但我在 csv 中有超过 415,000 行。

csv example:<br/>
pdf_no .   folder1. folder2 . folder3. <br/> 1 .  . abc. pqr. xyz.<br/>

这是 csv 的格式,我在 python 中借助 pandas 数据框提取列数据没有问题。最初它是一个 .dta 文件,我转换为 .csv with pandas. So 'folder1' &gt; 'folder 2' &gt; 'folder 3' &gt; 'pdf_no'.The 'pdf_no.'列包含文件名,这是我们想要在给定文件夹中维护文件结构的数字。

所以这需要很多时间,而且每当我再次更改时,都会花费很多时间,我什至不知道它是否正确。

【问题讨论】:

    标签: python python-3.x file


    【解决方案1】:

    样本 csv

    pdf_no,folder1,folder2,folder3
    1,abc,def,ghi
    2,xyz,pqr,
    3,abc,def,ghi
    

    示例代码

    import csv
    import os
    import shutil
    
    
    target_csv = 'selection.csv'
    target_dir = 'selected_20190828/'
    source_dir = 'original_directory/'
    
    with open(target_csv) as f:
        rows = csv.reader(f)
        for line_no, row in enumerate(rows):
            if line_no == 0:  # Skip the first line because it's the title
                continue
    
            pdf_name = row[0] + '.pdf'
            dir_path = os.path.join(*row[1:])
    
            source = os.path.join(source_dir, dir_path, pdf_name)
            if not os.path.isfile(source):
                print('not exist: ', line_no, source)
                continue
            target = os.path.join(target_dir, dir_path)
            os.makedirs(target)
            shutil.copy2(source, target)
    

    说明

    其实你不需要pandas,你只需要

    • csv.reader 将 csv 文件读入 list
    • os.makedirs创建文件夹(这个方法类似于bash中的mkdir -p
    • os.path.join
    • shutil.copy2 将文件复制到新文件夹
    • os.path.isfile 确保原始文件存在

    我已经测试了上面的代码。它应该可以工作。

    【讨论】:

    • 感谢它的工作!但问题是当它抛出“FileExistsError: [Errno 17] File exists:”时,因为它试图再次创建文件夹。复制第一个文件时该文件夹已经创建,但是当第二个文件进入同一文件夹时,它说已经存在。
    • 使用 os.path.isdir() 检查目录是否存在。谢谢大家!
    【解决方案2】:

    您需要shutil.copytree 方法。你可以这样做:

    1. 阅读您的 CSV
    2. 构建文件路径(使用 os.path.join())
    3. 使用shutil.copytree将文件及其父目录复制到目标

    当目标文件已经存在时,您可能必须添加一个try...except 块以避免OsError,或者在复制新文件之前删除目标文件。

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      相关资源
      最近更新 更多