按特定顺序重命名具有两个不同名称的图像
rename images with two different name in specific order
我需要重命名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_or_ed
的值更改为 ED
。
我修改了你的代码来解决这个问题,并且对你的原始文件名进行了正确的排序,因为看起来你的文件名中没有前导零,你希望 10 在 9 之后,而不是在 1 之后. 我从这个 answer 中借用了一个函数,可以正确地对文件名列表进行排序。
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'))
结果(来自原始文件名附加到新文件名的代码(未显示)):
我需要重命名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_or_ed
的值更改为 ED
。
我修改了你的代码来解决这个问题,并且对你的原始文件名进行了正确的排序,因为看起来你的文件名中没有前导零,你希望 10 在 9 之后,而不是在 1 之后. 我从这个 answer 中借用了一个函数,可以正确地对文件名列表进行排序。
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'))
结果(来自原始文件名附加到新文件名的代码(未显示)):