python 子目录的文件路径不正确

python file path from sub directory not correct

编辑:使用Python 3.7 | Win10

我已经阅读了 python 中很多关于处理路径的帖子。尝试一个小脚本,按上次修改日期将所有文件和子目录文件分类到文件夹中。

到目前为止它的工作,所有的一个问题,当获取子目录时它 returns 以 \ 开头从而使最终的目录字符串 base_dir/\subdir.

这意味着第一组文件复制得很好,但子目录中的任何内容都失败了。

在想办法阻止这种情况发生时感到很头疼。希望在屏幕中断后我会弄清楚,但以防万一,如果这里的任何向导可以提供帮助,我们将不胜感激。

代码:

import os
import time
import datetime
import shutil
from typing import List, Tuple


SORT_DIR = r'to_sort/'


def date_from_seconds(file_stats):
    """
    Takes an os.stats variable and return a date
    Using the seconds elapsed since last modification
    """
    
    seconds = time.ctime(file_stats.st_mtime)
    date_filter = datetime.datetime.strptime(seconds, '%a %b %d %H:%M:%S %Y')
    date_to_return = f'{date_filter.day}-{date_filter.month}-{date_filter.year}'
    
    return date_to_return


def sort_files(path_directory: str, file_list: List[Tuple]):
    """
    Lists the files in the sort directory
    Uses recursion to obtain files from subdirectories
    Copies files to a directory named according to their last modified date
    """

    content_dir: List[str] = os.listdir(path_directory)

    for filename in content_dir:
        path_file = os.sep.join([path_directory, filename])
        if os.path.isdir(path_file):
            sort_files(path_file, file_list)
        else:
            try:
                stats = os.stat(path_file)
                date = date_from_seconds(stats)
                file_list.append((path_directory, filename, date))
                os.makedirs(date, exist_ok=True)
                print(f'{path_directory}{filename}')
                shutil.copy(f'{path_directory}{filename}', f'{date}/{filename}')
            except Exception as _err:
                print(_err)
                continue


files: List[Tuple] = []
sort_files(SORT_DIR, files)
print(files)

输出:

subdir_sort.py
to_sort/1001001.jpg
to_sort/1001002.jpg
to_sort/1001003.jpg
to_sort/\subdir1002007.jpg
[Errno 2] No such file or directory: 'to_sort/\subdir1002007.jpg'
to_sort/\subdir1002010.jpg
[Errno 2] No such file or directory: 'to_sort/\subdir1002010.jpg'
to_sort/\subdir1002021.jpg
[Errno 2] No such file or directory: 'to_sort/\subdir1002021.jpg'
[('to_sort/', '1001001.jpg', '21-9-2020'), ('to_sort/', '1001002.jpg', '21-9-2020'), ('to_sort/', '1001003.jpg', '21-9-2020'), ('to_sort/\subdir', '1002007.jpg', '16-9-2020'), ('to_sort/\subdir', '1002010.jpg', '16-9-2020'), ('to_sort/\subdir', '1002021.jpg', '16-9-2020')]

Process finished with exit code 0

谢谢!

编辑:orlevii 的回答很有魅力..这是更正后的代码:

def sort_files(path_directory: str, file_list: List[Tuple]):
    """
    Lists the files in the sort directory
    Uses recursion to obtain files from subdirectories
    Copies files to a directory named according to their last modified date
    """

    for data in os.walk(SORT_DIR):
        dir_path, folders, files = data
        print(dir_path)
        print(files)
        for file in files:
            try:
                dir_for_stat = f'{dir_path}\{file}'
                stats = os.stat(dir_for_stat)
                date = date_from_seconds(stats)
                file_list.append((dir_path, file, date))
                os.makedirs(date, exist_ok=True)
                print(f'{dir_path}\{file}')
                shutil.copy(f'{dir_path}\{file}', f'{date}\{file}')
            except Exception as _err:
                print(_err)
                continue

你运行在OS什么?

我看到你正在连接你的路径:

path_file = os.sep.join([path_directory, filename])

如果您在 Windows.

上,那是错误的

要使其正常工作,您可以使用

path_file = os.path.join(path_directory, filename)

第二,你自己实施扫描有什么原因吗?

您可以使用 os.walk 从给定的根路径开始获取所有 files/directories:

import os

SORT_DIR = 'to_sort'

for data in os.walk(SORT_DIR): # where to start searching
    dir_path, folders, files = data
    # Now do whatever you want with the `files` variable