Python переименовывает файл с помощью регулярных выражений - PullRequest
0 голосов
/ 25 апреля 2019

Привет! Я хочу переименовать файлы с одним исходным шаблоном (например, IMG_20190401_235959.jpg) в шаблон назначения (например, 2019-04-01_23_59_59.jpg)

Я пытаюсь сделать это в Python, но я не могу узнать, как использовать регулярное выражение для создания нового имени файла:

#!/usr/bin/python

import os, glob, sys, re    
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
    newfilename = re.sub(?????
    try:
       os.rename(filename,newfilename)
    except OSError,e:
       print e

Ответы [ 6 ]

1 голос
/ 25 апреля 2019

Не уверен, что регулярное выражение является лучшим вариантом здесь. Вы можете легко разделить его и использовать основные строковые операции:

original = 'IMG_20190401_235959.jpg'
ol = original.split('_')
date = f'{ol[1][:4]}-{ol[1][4:6]}-{ol[1][6:8]}'
time = f'{ol[2][:2]}_{ol[2][2:4]}_{ol[2][4:6]}'
new = f'{date}_{time}.jpg'
print(new)
1 голос
/ 25 апреля 2019

Вы можете использовать re.findall, чтобы получить необходимые группы из пути к файлу и присоединиться:

import re
def new_path(s):
  _, a, b, f_type = re.findall('[a-zA-Z0-9]+', s)
  new_b = '_'.join(b[i:i+2] for i in range(0, len(b), 2))
  return f'{a[:4]}-{a[4:6]}-{a[6:]}_{new_b}.{f_type}'

print(new_path('IMG_20190401_235959.jpg'))

Выход:

'2019-04-01_23_59_59.jpg'

Тогда:

import os, glob, sys, re    
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
  try:
    os.rename(filename, new_path(filename))
  except OSError,e:
    print(e)
0 голосов
/ 25 апреля 2019

Что вы можете сделать, это предварительно скомпилировать RegEx перед его использованием. Вы можете поступить так:

import re

sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub

Здесь sub_name - это функция, которую вы можете использовать позже в цикле for для замены имени каждого изображения.

Примечание. Игнорирование регистра (верхнего / нижнего регистра) может быть полезно в Windows, но вам также необходимо адаптировать вызов к glob.glob.

Ниже приведено решение, использующее glob.glob, но вы также можете использовать os.walk для просмотра каталога, поиска по всем изображениям…

# coding: utf-8
import glob
import os
import re
import sys

sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub

work_dir = sys.argv[1]

for old_path in glob.glob(os.path.join(work_dir, "IMG_*.jpg")):
    dirname, old_name = os.path.split(old_path)
    new_name = sub_name("\\1-\\2-\\3_\\4_\\5_\\6", old_name)
    new_path = os.path.join(dirname, new_name)
    try:
        os.rename(old_path, new_path)
    except OSError as exc:
        print(exc)

Я заметил, что вы используете оператор print и синтаксис Python 2.6 для исключения. Предпочтительно использовать новый синтаксис. Если вы используете Python 2.7, вы можете добавить директиву:

from __future__ import print_function

Поместите это в верхней части вашего импорта ...

0 голосов
/ 25 апреля 2019
import re

regex = re.compile(r'^IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})\.jpeg$')

oldStr = 'IMG_20190401_235959.jpeg';

match = regex.match(oldStr)

newStr = '{}-{}-{}_{}_{}.jpg'.format(*match.groups())

print(newStr) # 2019-04-01_23_59.jpg
0 голосов
/ 25 апреля 2019

Если ваш ввод соответствует, это должно работать:

import re
pattern = r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})"
test_str = "IMG_20190401_235959.jpg"
subst = "\\1-\\2-\\3_\\4_\\5_\\6"
result = re.sub(pattern, subst, test_str, 0, re.MULTILINE)
if result:
    print (result)

# 2019-04-01_23_59_59.jpg
0 голосов
/ 25 апреля 2019

Следующий код работал для меня, однако он использует только регулярное выражение для удаления IMG_ в имени файла, так что вы также можете просто полностью удалить регулярное выражение.

newfilename = re.sub('IMG_', '', filename)
newfilename = newfilename[0:4] + '-' + newfilename[4:6] + '-' + newfilename[6:11] + '_' + newfilename[11:13] + '_' + newfilename[13:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...