我希望不定期地按数字顺序重命名文件,例如1.png,2.png,3.png等
我尝试编写此代码,只是通过打印将要命名的文件以确保它正确而结束了它:
import os
os.chdir('/Users/hasso/Pictures/Digital Art/saved images for vid/1')
for f in os.listdir():
f_name=1
f_ext= '.png'
print('{}{}'.format(f_name, f_ext))
我将如何解决这个问题?
答案 0 :(得分:1)
当将路径直接传递到os.chdir()
时,我不确定为什么需要使用os.listdir()
来更改目录。要重命名文件,可以使用os.rename()
。您还需要增加文件名的计数器,因为您的当前代码在每次迭代中都使fname
等于1
。您需要将计数器保持在循环外,并在循环内递增。在这里可以使用enumerate()
,因为可以改用索引。
基本版本:
from os import listdir
from os import rename
from os.path import join
path = "path_to_images"
for i, f in enumerate(listdir(path), start=1):
rename(join(path, f), join(path, str(i) + '.png'))
您可以使用os.path.join()
获取完整路径,因为os.listdir()
不包含文件的完整路径。上面的代码也不是很可靠,因为它重命名了所有文件,并且不处理重命名已经存在的.png
文件。
高级版本:
from os import listdir
from os import rename
from os.path import join
from os.path import exists
path = "path_to_images"
extension = '.png'
fname = 1
for f in listdir(path):
if f.endswith(extension):
while exists(join(path, str(fname) + extension)):
fname += 1
rename(join(path, f), join(path, str(fname) + extension))
fname += 1
使用os.path.exists()
检查文件是否已存在。
答案 1 :(得分:1)
您将继续建议使用1.png
作为新名称,因为您总是在循环内设置f_name = 1
。在循环之前用1
对其进行初始化,然后在重命名每个文件时对其进行递增。
其他几点:
os.chdir
,因为即使默认值为.
(当前目录),您也可以提供目标路径到os.filelist
。user
主目录时,如果不必进行硬编码,那就很好了。 os.path.expanduser
为您检索此值。.png
个文件,然后在该列表上循环。os.rename
将引发错误。我在下面要做的是检查要使用的名字是否已经在列表中,如果是,请增加f_name
的数字。
import os
yourPath = os.path.expanduser('~')+'/Pictures/Digital Art/saved images for vid/1'
filelist = []
for f in os.listdir(yourPath):
if f.lower().endswith('.png'):
filelist.append (f)
f_name = 1
for f in filelist:
while True:
next_name = str(f_name)+'.png'
if not next_name in filelist:
break
f_name += 1
print ('Renaming {} to {}'.format(yourPath+'/'+f, next_name))
# os.rename (yourPath+'/'+f, next_name)
f_name += 1
答案 2 :(得分:-3)
import os
# following line is only for python 3. For python 2.7 directory should be a string.
# directory = os.fsencode(directory_in_str)
for filename in os.listdir(directory):
f_name=1
f_ext= '.png'
new_filename = '{}{}'.format(f_name, f_ext)
os.rename(filename, new_filename)
f_name += 1