Найти и изменить названия недостающих файлов.

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Стоит задача найти в папке все файлы с шаблоном в названии spam из spam1txt, spam2txt, spam4txt. Программа должна выбрать все файлы с шаблоном и найти отсутствующие. в выбранных заменить недостающие. Например есть spam1.txt, spam3.txt, spam4.txt - получить spam1.txt, spam2.txt, spam4.txt.
Найти нашел а вот выбрать и заменить названия не получается
Python:
#! python3
# fillGap.py - finds all files with given prefix in folder
# and locates gaps in numbering and fills the gap

import os, re, shutil
prefix = 'spam'
prefixRegex  = r'%s\d+\.\w+' % prefix #создание регулярного выражения
print ('prefixRegex=',prefixRegex)



for folderName, subfolders, filenames in os.walk('D:\\1'):
    print ('filenames=',filenames)
    filenamesstr =(" ".join(filenames))# возвращается строка из названий всех файлов
    print ('filenamesstr=',filenamesstr)
    mo = re.findall(prefixRegex, filenamesstr)# возвращается список совпадений с шаблоном
    mo1 =(" ".join(mo)) #Превращение списка в строку
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Например так:
Python:
from os import listdir, rename
import re
# Путь к папке
path = 'D:/folder/'
# Строка из файлов подходящих под шаблон
files = list(filter(lambda x: re.match(r'spam\d+\.txt', x), listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'{path}spam{n+1}.txt')
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Ты хочешь менять файлы только в одной папке, или так же и в её подпапках?

Например есть spam1.txt, spam3.txt, spam4.txt - получить spam1.txt, spam2.txt, spam4.txt
Почему 3 превратился в 2, а 4 так и остался?
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
В том и задача. Есть файлы 1,3,4 необходимо изменить названия чтобы не было пропусков те 1,2,3. Просто ошибка в первом тексте. В задаче было в одной папке.
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Например так:
Python:
from os import listdir, rename
import re
# Путь к папке
path = 'D:/folder/'
# Строка из файлов подходящих под шаблон
files = list(filter(lambda x: re.match(r'spam\d+\.txt', x), listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'spam{n+1}.txt')
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Сделал так
Python:
#! python3
# fillGap.py - finds all files with given prefix in folder
# and locates gaps in numbering and fills the gap

import os, re, shutil
from os import listdir, rename
prefix = 'spam'
prefixRegex  = r'%s\d+\.\w+' % prefix #создание регулярного выражения
print ('prefixRegex=',prefixRegex)



for folderName, subfolders, filenames in os.walk('D:\\1'):
    print ('filenames=',filenames)
    filenamesstr =(" ".join(filenames))# возвращается строка из названий всех файлов
    print ('filenamesstr=',filenamesstr)
    mo = re.findall(prefixRegex, filenamesstr)# возвращается список совпадений с шаблоном
    mo1 =(" ".join(mo)) #Превращение списка в строку

    print ('mo=',mo)
    print ('mo1=',mo1)

for bb in mo:
    print ('bb=',bb)

# Путь к папке
path = 'D:\\1'
# Строка из файлов подходящих под шаблон
files = list(filter(lambda x: re.match(r'spam\d+\.txt', x), listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'spam{n+1}.txt')

Папка D:\\1
Выдает ошибку.
 
Последнее редактирование модератором:

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Сделал так
Код:
#! python3
# fillGap.py - finds all files with given prefix in folder
# and locates gaps in numbering and fills the gap

import os, re, shutil
from os import listdir, rename
prefix = 'spam'
prefixRegex  = r'%s\d+\.\w+' % prefix #создание регулярного выражения
print ('prefixRegex=',prefixRegex)



for folderName, subfolders, filenames in os.walk('D:\\1'):
    print ('filenames=',filenames)
    filenamesstr =(" ".join(filenames))# возвращается строка из названий всех файлов
    print ('filenamesstr=',filenamesstr)
    mo = re.findall(prefixRegex, filenamesstr)# возвращается список совпадений с шаблоном
    mo1 =(" ".join(mo)) #Превращение списка в строку

    print ('mo=',mo)
    print ('mo1=',mo1)

for bb in mo:
    print ('bb=',bb)

# Путь к папке
path = 'D:\\1'
# Строка из файлов подходящих под шаблон
files = list(filter(lambda x: re.match(r'spam\d+\.txt', x), listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'spam{n+1}.txt')

Папка D:\\1
Выдает ошибку.
Еще не изучал lambda. Можно как-то без нее. Чтобы разобраться.
Я пробовал только ваш текст. Тоже выдает ошибку.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
1) Какая ошибка?
2) Зачем тебе код до "# Путь к папке"?

Ps. вставляя код укажи формат python
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Без lambda
Python:
from os import listdir, rename
import re
# Путь к папке
path = 'D:/folder/'
def test_name(name):
    """
    Проверяет подходит-ли название файла под шаблон
    """   
    return re.match(r'spam\d+\.txt', name)

files = list(filter(test_name, listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'spam{n+1}.txt')

Но вообще lambda это просто функция в одну строку
Python:
func = lambda x, y: x + y
# Это то же, что и
def func(x, y):
    return x + y
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Без lambda
Python:
from os import listdir, rename
import re
# Путь к папке
path = 'D:/folder/'
def test_name(name):
    """
    Проверяет подходит-ли название файла под шаблон
    """  
    return re.match(r'spam\d+\.txt', name)

files = list(filter(test_name, listdir(path)))
files.sort()
for n, f in enumerate(files):
    rename(path+f, f'spam{n+1}.txt')

Но вообще lambda это просто функция в одну строку
Python:
func = lambda x, y: x + y
# Это то же, что и
def func(x, y):
    return x + y
path = 'D:/folder/' изменил на path = 'D:/1/
Получаю
Traceback (most recent call last):
File "D:/Python/1/fillGap1.py.py", line 14, in <module>
rename(path+f, f'spam{n+1}.txt')
FileExistsError: [WinError 183] Невозможно создать файл, так как он уже существует: 'D:/1/spam1.txt' -> 'spam1.txt' У меня файлы 1,2,4
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Замени
rename(path+f, f'spam{n+1}.txt')
на
rename(path+f, f'{path}spam{n+1}.txt')
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Замени
rename(path+f, f'spam{n+1}.txt')
на
rename(path+f, f'{path}spam{n+1}.txt')
Спасибо. Теперь бы еще закрыть вопрос.
 

Форум IT Специалистов