用于重命名目录中文件的Python代码不起作用

时间:2018-12-22 12:00:05

标签: python

我希望不定期地按数字顺序重命名文件,例如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))

我将如何解决这个问题?

3 个答案:

答案 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对其进行初始化,然后在重命名每个文件时对其进行递增。

其他几点:

  1. 您不需要os.chdir,因为即使默认值为.(当前目录),您也可以提供目标路径到os.filelist
  2. 在处理user主目录时,如果不必进行硬编码,那就很好了。 os.path.expanduser为您检索此值。
  3. 遍历可能要更改的列表时,最好单独制作一个 要更改的项目的列表。因此,与其遍历所有文件并进行更改,不如通过首先收集要更改的所有项目来简化操作。根据您的情况,列出仅 .png个文件,然后在该列表上循环。
  4. 如果尝试重命名为已经存在的名称,
  5. (相当高级)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)

使用os.rename

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