Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 按特定顺序重命名具有两个不同名称的图像_Python 3.x_Rename_File Rename_Enumerate - Fatal编程技术网

Python 3.x 按特定顺序重命名具有两个不同名称的图像

Python 3.x 按特定顺序重命名具有两个不同名称的图像,python-3.x,rename,file-rename,enumerate,Python 3.x,Rename,File Rename,Enumerate,我需要用Python重命名文件夹中的992个图像名称。图像的名称应根据其顺序进行更改。比如说 old: image_1 new: P1_ES_1 old: image_2 new: P1_ES_2 old: image_3 new: P1_ES_3 old: image_4 new: P1_ED_1 old: image_5 new: P1_ED_2 old: image_6 new: P1_ED_3 old: image_7

我需要用Python重命名文件夹中的992个图像名称。图像的名称应根据其顺序进行更改。比如说

 old: image_1     new: P1_ES_1
 old: image_2     new: P1_ES_2
 old: image_3     new: P1_ES_3
 old: image_4     new: P1_ED_1
 old: image_5     new: P1_ED_2
 old: image_6     new: P1_ED_3
 old: image_7     new: P2_ES_1
 old: image_8     new: P2_ES_2
 old: image_9     new: P2_ES_3
 old: image_10    new: P2_ED_1

这是@anki提供的对我做了一些小改动的代码段,但问题是新名称以ED开头,但应该是ES。任何帮助都将不胜感激

import os
import glob

path = 'F:/my_data/imagesResized/'
#path = 'F:/my_data/labelsResized/'

fns = glob.glob(path + '*.png')
fns.sort(key = len)
print(fns)

es_or_ed = 'ES'

for i, fn in enumerate(fns):

    # Check for ED or ES

    if i % 3 == 0 and es_or_ed == 'ES':
        es_or_ed = 'ED'

    elif i % 3 == 0 and es_or_ed == 'ED':
        es_or_ed = 'ES'

    # Create new filename
    new_fn = 'P{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1) 
    #new_fn = 'P{}_{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1,"label")

    # rename...S
    os.rename(fn, os.path.join(path, new_fn + '.png'))

当前以ES开头的原因是零索引。在第一次循环迭代期间,
i==0
时,代码将
es\u或_ed
的值更改为
ed

我修改了您的代码来解释这一点,并对原始文件名执行了正确的排序,因为文件名中似乎没有前导零,您希望10位于9之后,而不是1之后。我从中借用了一个函数,它可以对文件名列表进行正确排序

import os
import glob

import re

def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
    return [int(text) if text.isdigit() else text.lower()
            for text in _nsre.split(s)]   

path = 'F:/my_data/labelsResized/'

fns = glob.glob(path + '*.png')

es_or_ed = 'ED'

for i, fn in enumerate(sorted(fns, key=natural_sort_key)):

    # Check for ED or ES

    if (i+1) % 3 == 1 and es_or_ed == 'ED':
        es_or_ed = 'ES'

    elif (i+1) % 3 == 1 and es_or_ed == 'ES':
        es_or_ed = 'ED'

    # Create new filename
    new_fn = 'P{}_{}_{}'.format(i // 6 + 1, es_or_ed, i%3+1) 

    # rename...S
    os.rename(fn, os.path.join(path, new_fn + '.png'))
结果(源于原始文件名附加到新文件名的代码(未显示):


感谢您分享此信息。它给了我同样的问题,首先它产生了ED,但我需要ES。另外,我确实在开始时更改了es_或_ed='es',但仍然是同一个问题。@Neda,你怎么知道你得到的是ed而不是es?这是因为当您在文件夹中查看文件时,文件是按名称排序的吗?因为如果是这样的话,那是因为字母表中“D”在“s”之前。我运行这段代码时将原始文件名添加到了新文件名中。你可以在我刚刚添加到答案的屏幕截图中看到,你正在寻找的关系就在那里。@Neda,我故意将es_或_ed(循环之前)的初始值更改为“ed”。我添加了图像_1,这是原始图像,重命名后的图像由你的脚本生成,是P1_ed_1,它们不相同。如果我做错了,那就不可能通过浏览992张图片找到那张图片。有什么想法吗?我希望图像_1更改为P1_ES_1,并且两个图像都是identical@Neda,脚本为图像_1生成的重命名文件是P1_ES_1,是否不清楚?请将图像_1与P1_ES_1进行比较。