【问题标题】:Moving all .csv files which match specific text pattern from multiple subfolders to new folder [Python]将与特定文本模式匹配的所有 .csv 文件从多个子文件夹移动到新文件夹 [Python]
【发布时间】:2021-05-02 12:51:52
【问题描述】:

我在这里看到了很多类似问题的答案,但由于我的 Python 技能初露端倪,我似乎还不能完全适应它。我想节省单独抓取包含我需要在 R 中进行分析的数据集的时间,但我的脚本要么没有运行,要么似乎在做我需要的事情。

我需要 1) 循环遍历父文件夹中的大量子文件夹,2) 遍历这些子文件夹中的 .csv 文件并选择重要的 1(匹配下面的文本)和 3) 将其复制到一个新的干净文件夹,里面只有我想要的。

我尝试过的:

1)

import os, shutil, glob

src_fldr = 'C:/project_folder_withsubfolders'; 

dst_fldr = 'C:/project_folder_withsubfolders/subfolder_to_dump_into'; 

try:
  os.makedirs(dst_fldr); ## it creates the destination folder
except:
  print ("Folder already exist or some error");

for csv_file in glob.glob(src_fldr+'*statistics_Intensity_Sum_Ch=3_Img=1.csv*'):
    shutil.copy2(csv_file, dst_fldr);

文本 statistics_Intensity_Sum 等是我复制文件所需的确切模式

  • 这实际上并没有复制任何内容
  1. 制作一个可以做到这一点的函数:
srcDir = 'C:/project_folder_withsubfolders'
dstDir = 'C:/project_folder_withsubfolders/subfolder_to_dump_into'
def moveAllFilesinDir(srcDir, dstDir):
    files = os.listdir(srcDir)
    for f in files:
        if f.find("statistics_Intensity_Sum_Ch=3_Img=1"):
            shutil.move(f, dstDir)
        else:
            shutil.move(f, srcDir)
moveAlllFilesinDir(srcDir, dstDir)
  • 这返回了以下错误:
  File "C:\Users\jbla12\AppData\Local\Programs\Python\Python39\lib\shutil.py", line 806, in move
    os.rename(src, real_dst)
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'F1 converted' -> 'C:/Users/jbla12/Desktop/R Analyses/p65_project/sum_files\\F1 converted' 

那是因为这是我希望它通过的子文件夹!我尝试了其他方法,但在我的脚本中没有记录。

【问题讨论】:

  • 好吧,如果dstDir不存在,你需要先创建它...见makedirs
  • 它确实存在 - 我可以截图显示它是在指定位置创建的
  • 错过了那部分代码...为什么不在print(csv_file) 循环内添加print(csv_file)。检查它是否找到了一些东西
  • 请阅读How to debug small programs。您还可以使用Python-Tutor,这有助于逐步可视化代码的执行。
  • 不,我是说我是在 Windows 中制作的。除非它会直观地显示一个文件夹并且它实际上并不存在,否则我不确定还能说什么。

标签: python loops pattern-matching subdirectory file-copying


【解决方案1】:

已解决: 特别感谢“自动化无聊的东西”

import shutil
import os

dest = 'C:/Users/jbla12/Desktop/R Analyses/p65_project/sum_files/'
src = 'C:/Users/jbla12/Desktop/R Analyses/p65_project/'
txt_ID = 'statistics_Intensity_Sum_Ch=3_Img=1.csv'
def moveSpecFiles(txt_ID, src, dest):
    #src is the original file(s) destination
    #dest is the destination for the files to end up in
    #spec_txt is what the files end with that you want to ID
    for foldername, subfolders, filenames in os.walk(src):
        for file in filenames:
            if file.endswith(txt_ID):
                shutil.copy(os.path.join(foldername, file), dest)
    print('Your files are ready sir/madam!')


moveSpecFiles(txt_ID, src, dest)

【讨论】: