为什么当我使用此python脚本重命名文件时,文件会被删除?



我创建了这个程序,以使用以下代码将所有随机壁纸名称重命名为wallpaper1wallpaper2等:

import os
path = os.chdir("/home/samipkarki/Pictures/Wallpapers")
value = 1
for file in os.listdir("path"):
new_filename = f'wallpaper{value}.jpg'
os.rename(file, new_filename)
value += 1

但是每次我运行代码时,半个文件都会被重命名,其他文件会被永久删除。

最好将重命名的文件保存到单独的文件夹中,您可以使用enumerate()作为数字:

import os
path = os.chdir("/home/samipkarki/Pictures/Wallpapers")
for n,file in enumerate(os.listdir("path")):
new_filename = f'wallpaper{n+1}.jpg'
os.rename(file, "/home/samipkarki/Pictures/Wallpapers2/"+new_filename) # Put it in another folder

确保您在"图片"文件夹中创建了另一个名为"壁纸2"的文件夹。

(这里建议一个相当小的更改,但作为一个答案,因为很难通过注释明确地显示它。

插入检查是否存在新文件名,如果有,则继续递增数字,直到得到一个不存在的文件名。 这将防止覆盖以前运行同一脚本时已重命名的文件。

import os
path = os.chdir("/home/samipkarki/Pictures/Wallpapers")
value = 1
for file in os.listdir("path"):
new_filename = f'wallpaper{value}.jpg'
while os.path.exists(new_filename):
value += 1
new_filename = f'wallpaper{value}.jpg'
os.rename(file, new_filename)
value += 1

这是一个有点依赖于平台的细节。如果你使用的是Windows,你会得到一个FileExistsError异常,但在Unix上不会。

文档是这样说的:

将文件或目录 src 重命名为 dst。如果 dst 存在,则在很多情况下,操作将失败并带有 OSError 子类:

在 Windows 上,如果 dst 存在,则始终会引发 FileExistsError。

在Unix上,如果src是一个文件,dst是一个目录,反之亦然,将分别引发IsADirectoryError或NotADirectoryError。如果两者都是目录并且 dst 为空,则 dst 将被静默替换。如果 dst 是非空目录,则会引发 OSError。如果两者都是文件,则如果用户具有权限,dst 它将以静默方式替换。如果 src 和 dst 位于不同的文件系统上,则在某些 Unix 风格上操作可能会失败。如果成功,重命名将是一个原子操作(这是 POSIX 要求(。

因此,您需要执行手动检查文件是否存在,如果存在,请以某种方式处理它。

可能不会影响您的程序的一件事是检查此(来自alaniwi的答案(表格:

while os.path.exists(new_filename):
value += 1
new_filename = f'wallpaper{value}.jpg'
os.rename(file, new_filename)

并不完全安全。在确定文件名可用和开始写入的事件之间,另一个进程可能会创建具有该名称的文件。如果这是一个问题,请查看此问题

alaniwi的方法和这的组合可能看起来像这样:

while True:
value += 1
new_filename = f'wallpaper{value}.jpg'
try:
os.open(new_filename, os.O_CREAT | os.O_EXCL)
break
except FileExistsError:
pass

基本原则是,您永远无法提前知道手术是否会成功。因此,您需要做的是尝试执行操作并查看它是否成功。

由于@alawani建议,我想出了答案。 如果你们发现一些问题,请纠正我。 问题如答案中所述,代码覆盖了现有文件,因此此代码检查文件是否存在,如果存在,那么它将通过,否则它将重命名它。

import os
path = os.chdir("/home/samipkarki/Pictures/Wallpapers")
value = 1
for file in os.listdir(path):
print(os.listdir(path))
new_filename = f'wallpaper{value}.jpg'
if os.path.exists(new_filename):
pass
else:
os.rename(file, new_filename)
value += 1

最新更新