编辑:使用 Python 3.7 | 赢10
我已经阅读了很多关于在 python 中处理路径的帖子。尝试编写一个小脚本,按上次修改日期将所有文件和子目录文件分类到文件夹中。
到目前为止,它的工作原理是一个问题,当获取子目录时,它以 \ 开头返回,从而使最终目录字符串 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
你在什么操作系统上运行?
我看到你正在连接你的路径:
path_file = os.sep.join([path_directory, filename])
如果您使用的是 Windows,这是错误的。
为了使其正常工作,您可以使用
path_file = os.path.join(path_directory, filename)
2,您自己实施扫描有什么原因吗?
您可以使用os.walk
从给定的根路径开始获取所有文件/目录:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句