繁体   English   中英

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

[英]Python code for renaming files in directory not working

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

我将如何解决呢?

我不确定为什么只需将路径直接传递给os.listdir()时,为什么需要使用os.chdir()来更改目录。 要重命名文件,可以使用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.png作为新名称,因为您总是在循环设置f_name = 1 在循环之前用1对其进行初始化,然后在重命名每个文件时对其进行递增。

其他几点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM