Python 如果文件已经存在,如何防止shutil.move覆盖该文件?
我正在Python 如果文件已经存在,如何防止shutil.move覆盖该文件?,python,python-3.x,shutil,Python,Python 3.x,Shutil,我正在Windows中使用这个Python代码: shutil.move(documents_dir + "\\" + file_name, documents_dir + "\\backup\\" + subdir_name + "\\" + file_name) 如果多次调用此代码,它将覆盖目标文件。我想移动文件 如果目标已存在,请重命名它 e、 g.文件名=foo.pdf 而在backup文件夹中,将是foo.pdf,foo(1.pdf,foo(2.pdf等,或类
Windows
中使用这个Python
代码:
shutil.move(documents_dir + "\\" + file_name, documents_dir + "\\backup\\"
+ subdir_name + "\\" + file_name)
如果多次调用此代码,它将覆盖目标文件。我想移动文件
如果目标已存在,请重命名它
e、 g.文件名
=foo.pdf
而在backup
文件夹中,将是foo.pdf
,foo(1.pdf
,foo(2.pdf
等,或类似的,例如带有破折号
foo-1.pdf
,foo-2.pdf
等您可以在运行时使用os.path.exists()
进行检查
import os
import shutil
file_name = 'test.csv'
documents_dir = r'C:\BR\Test'
subdir_name = 'test'
# using os.path.join() makes your code easier to port to another OS
source = os.path.join(documents_dir, file_name)
dest = os.path.join(documents_dir, 'backup', subdir_name, file_name)
num = 0
# loop until we find a file that doesn't exist
while os.path.exists(dest):
num += 1
# use rfind to find your file extension if there is one
period = file_name.rfind('.')
# this ensures that it will work with files without extensions
if period == -1:
period = len(file_name)
# create our new destination
# we could extract the number and increment it
# but this allows us to fill in the gaps if there are any
# it has the added benefit of avoiding errors
# in file names like this "test(sometext).pdf"
new_file = f'{file_name[:period]}({num}){file_name[period:]}'
dest = os.path.join(documents_dir, 'backup', subdir_name, new_file)
shutil.move(source, dest)
或者,因为这可能在循环中使用,所以您可以将其放入函数中
import os
import shutil
def get_next_file(file_name, dest_dir):
dest = os.path.join(dest_dir, file_name)
num = 0
while os.path.exists(dest):
num += 1
period = file_name.rfind('.')
if period == -1:
period = len(file_name)
new_file = f'{file_name[:period]}({num}){file_name[period:]}'
dest = os.path.join(dest_dir, new_file)
return dest
file_name = 'test.csv'
documents_dir = r'C:\BR\Test'
subdir_name = 'test'
source = os.path.join(documents_dir, file_name)
dest = get_next_file(file_name, os.path.join(documents_dir, 'backup', subdir_name))
shutil.move(source, dest)