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
编辑:使用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