【问题标题】:Unable to send file from source folder to directory [python]无法将文件从源文件夹发送到目录 [python]
【发布时间】:2021-10-20 18:12:44
【问题描述】:

我正在使用 shutil.copy 根据文件的文件名将文件发送到目录中的预期文件夹。

我在名为“Downloaded_Data”的文件夹中有以下文件列表:

Subject_Blue_Cold_D_A_1.csv 
Subject_Blue_Cold_D_A_2.csv
Subject_Blue_Cold_D_A_3.csv  
Subject_Blue_Cold_D_B_1.csv 
Subject_Blue_Cold_D_B_2.csv 
Subject_Blue_Cold_D_B_3.csv 
Subject_Blue_Cold_D_C_1.csv 
Subject_Blue_Cold_D_C_2.csv 
Subject_Blue_Cold_D_C_3.csv 
Subject_Blue_Mild_D_A_1.csv 
Subject_Blue_Mild_D_A_2.csv 
Subject_Blue_Mild_D_A_3.csv 
Subject_Blue_Mild_D_B_1.csv 
Subject_Blue_Mild_D_B_2.csv 
Subject_Blue_Mild_D_B_3.csv 
Subject_Blue_Mild_D_C_1.csv 
Subject_Blue_Mild_D_C_2.csv 
Subject_Blue_Mild_D_C_3.csv 
Subject_Blue_Hot_D_A_1.csv 
Subject_Blue_Hot_D_A_2.csv 
Subject_Blue_Hot_D_A_3.csv 
Subject_Blue_Hot_D_B_1.csv 
Subject_Blue_Hot_D_B_2.csv 
Subject_Blue_Hot_D_B_3.csv 
Subject_Blue_Hot_D_C_1.csv 
Subject_Blue_Hot_D_C_2.csv 
Subject_Blue_Hot_D_C_3.csv 
Subject_Red_Cold_D_A_1.csv 
Subject_Red_Cold_D_A_2.csv
Subject_Red_Cold_D_A_3.csv  
Subject_Red_Cold_D_B_1.csv 
Subject_Red_Cold_D_B_2.csv 
Subject_Red_Cold_D_B_3.csv 
Subject_Red_Cold_D_C_1.csv 
Subject_Red_Cold_D_C_2.csv 
Subject_Red_Cold_D_C_3.csv 
Subject_Red_Mild_D_A_1.csv 
Subject_Red_Mild_D_A_2.csv 
Subject_Red_Mild_D_A_3.csv 
Subject_Red_Mild_D_B_1.csv 
Subject_Red_Mild_D_B_2.csv 
Subject_Red_Mild_D_B_3.csv 
Subject_Red_Mild_D_C_1.csv 
Subject_Red_Mild_D_C_2.csv 
Subject_Red_Mild_D_C_3.csv 
Subject_Red_Hot_D_A_1.csv 
Subject_Red_Hot_D_A_2.csv 
Subject_Red_Hot_D_A_3.csv 
Subject_Red_Hot_D_B_1.csv 
Subject_Red_Hot_D_B_2.csv 
Subject_Red_Hot_D_B_3.csv 
Subject_Red_Hot_D_C_1.csv 
Subject_Red_Hot_D_C_2.csv 
Subject_Red_Hot_D_C_3.csv 

然后我需要将所有这些文件分类到一个名为“Input_Data”的文件夹中的预期子文件夹中。因此我需要根据它们的文件名将这些文件放入以下文件目录中:

Input_Data > Blue_Cold
                > DA
                > DB
                > DC
           > Blue_Mild
                > DA
                > DB
                > DC
           > Blue_Hot
                > DA
                > DB
                > DC
           > Red_Cold
                > DA
                > DB
                > DC
           > Red_Mild
                > DA
                > DB
                > DC
           > Red_Hot
                > DA
                > DB
                > DC

这是我目前使用的代码:

import os

source_folder = os.path.join("Downloaded_Data")

for filename in os.listdir(source_folder):

    name_parts = filename.split("_")
    
    first_folder = "_".join([name_parts[1], name_parts[2]])
    
    second_folder = "D" + name_parts[4]

    dest_root_dir = Path('Input_Data')
    dest_dir = dest_root_dir.joinpath(first_folder, second_folder, filename)
    dest_dir.mkdir(exist_ok=True)
    dest_filepath = dest_dir.joinpath(filename)
    shutil.copy2(filename, dest_dir)

我收到以下错误:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-50-257fc6665649> in <module>()
     29     dest_dir.mkdir(exist_ok=True)
     30     dest_filepath = dest_dir.joinpath(filename)
---> 31     shutil.copy2(filename, dest_dir)
     32 
     33 

~\Anaconda3\lib\shutil.py in copy2(src, dst, follow_symlinks)
    255     if os.path.isdir(dst):
    256         dst = os.path.join(dst, os.path.basename(src))
--> 257     copyfile(src, dst, follow_symlinks=follow_symlinks)
    258     copystat(src, dst, follow_symlinks=follow_symlinks)
    259     return dst

~\Anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
    118         os.symlink(os.readlink(src), dst)
    119     else:
--> 120         with open(src, 'rb') as fsrc:
    121             with open(dst, 'wb') as fdst:
    122                 copyfileobj(fsrc, fdst)

FileNotFoundError: [Errno 2] No such file or directory: 'Subject_Blue_Cold_D_A_1.csv .csv'

如果此文件存在并且之前已被代码识别,为什么我会收到此错误消息?如何解决此问题,以便这些文件最终位于正确的文件夹中?

【问题讨论】:

    标签: python file directory copy shutil


    【解决方案1】:

    有一个简单的解决方案。

    import pandas as pd
    from pathlib import Path
    import shutil
    
    def custom_copy(series: Path, source_path: Path):
        source = source_path.joinpath(series.name)
        series.parent.mkdir(exist_ok=True, parents=True)
        shutil.copy2(source, series.parent)
        
        
    source_path = Path("./Downloaded_Data/")
    target_path = Path("./Input_Data/")
    
    # file_pattern: extract info from file name.
    # group a: (?P<a>[a-zA-Z]+_[a-zA-Z]+)                                             -> Red_Mild
    # group b: (?P<b>[A-Z]_[A-Z])                                                     -> D_A
    # group c: (?P<c>[a-zA-Z]+_(?P<a>[a-zA-Z]+_[a-zA-Z]+)_(?P<b>[A-Z]_[A-Z])_\d\.csv) -> Subject_Blue_Cold_D_A_1.csv
    file_pattern = r"(?P<c>[a-zA-Z]+_(?P<a>[a-zA-Z]+_[a-zA-Z]+)_(?P<b>[A-Z]_[A-Z])_\d\.csv)"
    
    _ = (
        pd.Series(source_path.glob("Subject_*.csv"))                  # 1. get all files from the source folder.
        .apply(lambda x: x.name)                                      # 2. extract filenames form files.
        .str.extract(file_pattern)                                    # 3. extract file patterns from filenames.
        .assign(b=lambda x: x.b.str.replace("_", ""))                 # 4. D_A -> DA: can be simplified
        .sort_index(axis=1)                                           # 5. sort groups to a-b-c.
        .apply(lambda x: target_path.joinpath(*x.values), axis=1)     # 6. construct target file path.
        .apply(custom_copy, source_path=source_path)                  # 7. execute the copy command.
    )
    

    结果是:

    $ tree Input_Data 
    Input_Data
    ├── Blue_Cold
    │   ├── DA
    │   │   ├── Subject_Blue_Cold_D_A_1.csv
    │   │   ├── Subject_Blue_Cold_D_A_2.csv
    │   │   └── Subject_Blue_Cold_D_A_3.csv
    │   ├── DB
    │   │   ├── Subject_Blue_Cold_D_B_1.csv
    │   │   ├── Subject_Blue_Cold_D_B_2.csv
    │   │   └── Subject_Blue_Cold_D_B_3.csv
    │   └── DC
    │       ├── Subject_Blue_Cold_D_C_1.csv
    │       ├── Subject_Blue_Cold_D_C_2.csv
    │       └── Subject_Blue_Cold_D_C_3.csv
    └── Red_Mild
        ├── DA
        │   ├── Subject_Red_Mild_D_A_1.csv
        │   ├── Subject_Red_Mild_D_A_2.csv
        │   └── Subject_Red_Mild_D_A_3.csv
        ├── DB
        │   ├── Subject_Red_Mild_D_B_1.csv
        │   ├── Subject_Red_Mild_D_B_2.csv
        │   └── Subject_Red_Mild_D_B_3.csv
        └── DC
            ├── Subject_Red_Mild_D_C_1.csv
            ├── Subject_Red_Mild_D_C_2.csv
            └── Subject_Red_Mild_D_C_3.csv
    

    【讨论】:

      【解决方案2】:

      os.listdir 只返回基本文件名,不返回它们的路径名。根据文件名执行任何操作时,应在文件名前面加上路径名:

      shutil.copy2(os.path.join(source_folder, filename), dest_dir)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        相关资源
        最近更新 更多