Python 使用 os.rename 意外移动文件
Python unexpectedly moving files with os.rename
我有一个脚本:
- 遍历目录及其子目录中的所有文件
- 为文件列表中的每个唯一年份创建文件夹
- 将文件移动到各自的文件夹 years
- 根据时间戳 + 唯一编号重命名它们。
当我 运行 仅第 1-3 部分时,它会将文件正确移动到文件夹中。
当我 运行 第 1-4 部分(包括 os.rename 部分)时,它会在将文件移回父目录后重命名这些文件。
起始文件结构:
parent_folder
--> file.txt modified 01-21-2012
--> file2.txt modified 09-30-2013
--> file3.txt modified 06-21-2017
预期结果:
parent_folder
--> '2012'
--> 2012-01-21-1.txt
--> '2013'
--> 2013-09-30-2.txt
--> '2017'
--> 2017-06-21-3.txt
实际结果:
parent_folder
--> '2012'
--> '2013'
--> '2017'
--> '2012-01-21-1.txt'
--> '2013-09-30-2.txt'
--> '2017-06-21-4.txt'
如您所见,它重命名了文件,但将它们移出了它们的文件夹。为什么要这样做?
我的代码(我插入了用于记录的打印语句):
import os, datetime, sys, shutil
#PART 1 : Change to the inputted directory
#===============================
# This is the directory I will work on.
p = 'ENTER_FOLDER_PATH_HERE'
print('This is the directory that will be organized:')
print(os.getcwd())
if os.path.isdir(p): # check if directory exists
print("Step 1: Changing directory")
os.chdir(p)
#PART 2 : Make a folder for each unique year
#===========================================
fileNames = next(os.walk(os.getcwd()))[2] # list files, excluding subdirectories
f = {}
filename = []
dates = []
# Loop through each file and grab the unique year.
# Store the file (key) and its modified year (value) into dictionary 'f'.
for name in fileNames:
f[name] = datetime.datetime.fromtimestamp(os.path.getmtime(name)).strftime("%Y")
dates = list(set(f.values()))
# Create the list of unique folders from the dictionary.
print("Step 2: Creating the following folders:\n", dates)
print('\n')
[os.mkdir(folder) for folder in dates]
#PART 3: Move all files to their respective folders based on modified year.
#==========================================================================
if sys.platform == 'Windows':
print("Step 3: moving files...")
[shutil.move(key, os.getcwd() + '\' + value) for key, value in f.items()]
elif sys.platform == 'darwin':
print("Step 3: moving files...")
[shutil.move(key, os.getcwd() + '//' + value) for key, value in f.items()]
else:
print("Sorry, this script is not supported in your OS.")
else:
print("Oops, seems like that directory doesn't exist. Please try again.")
#PART 4: Rename the files
#==========================================================================
# Get each file in directory and renames it to its modified date, Y-M-D format
count=1
for root, dir, files in os.walk(p):
for file in files:
if not file.startswith('.'): # ignore hidden files
filePath = os.path.join(root,file)
ext = os.path.splitext(filePath)[1]
print("File number: ", count, file, ext)
print('\n')
os.rename(filePath, datetime.datetime.fromtimestamp(os.path.getmtime(filePath)).strftime("%Y-%m-%d") + '-' + str(count) + ext)
count += 1
print(filePath)
日志:
This is the directory that will be organized:
TEST_PATH
Step 1: Changing directory
Step 2: Creating the following folders:
['2013', '2012', '2017']
Step 3: moving files...
File number: 1 2012-01-21-1.jpg TEST_PATH/2012/2012-01-21-1.jpg
TEST_PATH//2012/2012-01-21-1.jpg
File number: 2 2013-09-30-2.jpg TEST_PATH/2013/2013-09-30-2.jpg
TEST_PATH/2013/2013-09-30-2.jpg
TEST_PATH/2013/2013-09-30-2.jpg
File number: 4 June 21 2017.txt TEST_PATH/2017/June 21 2017.txt
TEST_PATH/2017/June 21 2017.txt
它会移动文件,因为您当前所在的工作目录。我猜它的工作方式就像 mv
命令一样。在 raname 之后生成的文件将被放置在 os.rename
函数的第二个参数指定的路径中,相对于 cwd
。如果你想让它正常工作,你需要用新文件名指定相对路径。
顺便说一句。你可以通过这种方式一次完成第 3 步和第 4 步。
我有一个脚本:
- 遍历目录及其子目录中的所有文件
- 为文件列表中的每个唯一年份创建文件夹
- 将文件移动到各自的文件夹 years
- 根据时间戳 + 唯一编号重命名它们。
当我 运行 仅第 1-3 部分时,它会将文件正确移动到文件夹中。
当我 运行 第 1-4 部分(包括 os.rename 部分)时,它会在将文件移回父目录后重命名这些文件。
起始文件结构:
parent_folder
--> file.txt modified 01-21-2012
--> file2.txt modified 09-30-2013
--> file3.txt modified 06-21-2017
预期结果:
parent_folder
--> '2012'
--> 2012-01-21-1.txt
--> '2013'
--> 2013-09-30-2.txt
--> '2017'
--> 2017-06-21-3.txt
实际结果:
parent_folder
--> '2012'
--> '2013'
--> '2017'
--> '2012-01-21-1.txt'
--> '2013-09-30-2.txt'
--> '2017-06-21-4.txt'
如您所见,它重命名了文件,但将它们移出了它们的文件夹。为什么要这样做?
我的代码(我插入了用于记录的打印语句):
import os, datetime, sys, shutil
#PART 1 : Change to the inputted directory
#===============================
# This is the directory I will work on.
p = 'ENTER_FOLDER_PATH_HERE'
print('This is the directory that will be organized:')
print(os.getcwd())
if os.path.isdir(p): # check if directory exists
print("Step 1: Changing directory")
os.chdir(p)
#PART 2 : Make a folder for each unique year
#===========================================
fileNames = next(os.walk(os.getcwd()))[2] # list files, excluding subdirectories
f = {}
filename = []
dates = []
# Loop through each file and grab the unique year.
# Store the file (key) and its modified year (value) into dictionary 'f'.
for name in fileNames:
f[name] = datetime.datetime.fromtimestamp(os.path.getmtime(name)).strftime("%Y")
dates = list(set(f.values()))
# Create the list of unique folders from the dictionary.
print("Step 2: Creating the following folders:\n", dates)
print('\n')
[os.mkdir(folder) for folder in dates]
#PART 3: Move all files to their respective folders based on modified year.
#==========================================================================
if sys.platform == 'Windows':
print("Step 3: moving files...")
[shutil.move(key, os.getcwd() + '\' + value) for key, value in f.items()]
elif sys.platform == 'darwin':
print("Step 3: moving files...")
[shutil.move(key, os.getcwd() + '//' + value) for key, value in f.items()]
else:
print("Sorry, this script is not supported in your OS.")
else:
print("Oops, seems like that directory doesn't exist. Please try again.")
#PART 4: Rename the files
#==========================================================================
# Get each file in directory and renames it to its modified date, Y-M-D format
count=1
for root, dir, files in os.walk(p):
for file in files:
if not file.startswith('.'): # ignore hidden files
filePath = os.path.join(root,file)
ext = os.path.splitext(filePath)[1]
print("File number: ", count, file, ext)
print('\n')
os.rename(filePath, datetime.datetime.fromtimestamp(os.path.getmtime(filePath)).strftime("%Y-%m-%d") + '-' + str(count) + ext)
count += 1
print(filePath)
日志:
This is the directory that will be organized:
TEST_PATH
Step 1: Changing directory
Step 2: Creating the following folders:
['2013', '2012', '2017']
Step 3: moving files...
File number: 1 2012-01-21-1.jpg TEST_PATH/2012/2012-01-21-1.jpg
TEST_PATH//2012/2012-01-21-1.jpg
File number: 2 2013-09-30-2.jpg TEST_PATH/2013/2013-09-30-2.jpg
TEST_PATH/2013/2013-09-30-2.jpg
TEST_PATH/2013/2013-09-30-2.jpg
File number: 4 June 21 2017.txt TEST_PATH/2017/June 21 2017.txt
TEST_PATH/2017/June 21 2017.txt
它会移动文件,因为您当前所在的工作目录。我猜它的工作方式就像 mv
命令一样。在 raname 之后生成的文件将被放置在 os.rename
函数的第二个参数指定的路径中,相对于 cwd
。如果你想让它正常工作,你需要用新文件名指定相对路径。
顺便说一句。你可以通过这种方式一次完成第 3 步和第 4 步。