Переименование файлов в том порядке, в котором они называются python - PullRequest
0 голосов
/ 07 марта 2019

Я использую скрипт на python, с помощью которого другие парни помогли мне переименовать все файлы .jpg или .png в каталоге в любое, что я хочу, по порядку. Поэтому, если у меня есть 20 файлов .png в каталоге, я хочу переименовать их в порядке от 1 до 20.

Сценарий, который я имею, ДЕЛАЕТ это, и я счастлив этим. Однако только что было указано, что файлы, которые я переименовал с помощью этого сценария, вышли из строя.

Например, когда я переименовываю 1.png в testImage1.png, я действительно переименовываю testImage10.png в testImage1.png. Я проверил это с помощью своего скрипта, создав 5 текстовых файлов с одинаковым содержимым, но текстовые файлы 1-3 я помещаю в другой контент, чтобы отслеживать, что есть что после того, как я переименовал. Конечно же, все смешалось.

import os
import sys

source = sys.argv[1]
files = os.listdir(source)
name = sys.argv[2]

def rename():
    i = 1
    for file in files:
        os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.png'))
        i += 1

rename()

Я потратил время, чтобы попытаться использовать свои (ограниченные) знания Python, чтобы создать серию операторов if / elif для просеивания и переименования файлов с правильным именем по порядку.

def roundTwo():
    print('Beginning of the end')
    i = 1
    for root, dirs, files in os.walk(source):
            for file in files:
                    print('Test')
                    if source == 'newFile0.txt' or 'newFile0.png':
                            os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.txt'))
                            print('Test1')
                            i += 1
                    elif source == 'newFile1.txt' or 'newFile1.png':
                            os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.txt'))
                            print('Test2')
                            i += 1


roundTwo()

Я выполнил немало поисков, чтобы включить использование Re или fnmatch, но ничто не сравнится с тем, что я собираюсь сделать. Возможно, я использую неправильные термины для поиска? Любое понимание помогает!

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Если ваша проблема с 1 и 10, то вы можете использовать natural sorting. Сортируйте переменную files следующим образом:

from natsort import natsorted, ns
natsorted(files, alg=ns.IGNORECASE)

Пример:

>>> x = ['a/b/c21.txt', 'a/b/c1.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c2.txt']
>>> sorted(x)
['a/b/c1.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c2.txt', 'a/b/c21.txt']

>>> natsorted(x, alg=ns.IGNORECASE)
['a/b/c1.txt', 'a/b/c2.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c21.txt']
0 голосов
/ 07 марта 2019

Если все файлы имеют какое-то базовое имя, вы можете изменить свою первую функцию, чтобы извлечь номер, присвоенный изображению

baseName='testImage'
def rename():
    for file in files:
        number=file[len(baseName):file.find('.png')]
        os.rename(os.path.join(source, file), os.path.join(source, name+number+'.png'))

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...