Переименование нескольких файлов в каталоге в Python [дубликат]
этот вопрос уже есть ответ здесь:
- как переименовать файл с помощью Python 10 ответов
- переименовать несколько файлов в Python 2 ответы
Я пытаюсь переименовать некоторые файлы в каталоге с использованием Python.
скажем, у меня есть файл с названием CHEESE_CHEESE_TYPE.***
и хотите удалить CHEESE_
таким образом, мое результирующее имя файла будет CHEESE_TYPE
Я пытаюсь использовать os.path.split
но это не работает должным образом. Я также рассматривал возможность использования струнных манипуляций, но также не был успешным с этим.
15 ответов
использовать os.rename(src, dst)
переименовать или переместить файл или каталог.
$ ls
cheese_cheese_type.bar cheese_cheese_type.foo
$ python
>>> import os
>>> for filename in os.listdir("."):
... if filename.startswith("cheese_"):
... os.rename(filename, filename[7:])
...
>>>
$ ls
cheese_type.bar cheese_type.foo
вот сценарий, основанный на вашем новейшем комментарии.
#!/usr/bin/env python
from os import rename, listdir
badprefix = "cheese_"
fnames = listdir('.')
for fname in fnames:
if fname.startswith(badprefix*2):
rename(fname, fname.replace(badprefix, '', 1))
предполагая, что вы уже находитесь в каталоге и что" первые 8 символов " из вашего комментария всегда верны. (Хотя "Cheese" - это 7 символов... ? Если это так, измените 8 ниже на 7)
from glob import glob
from os import rename
for fname in glob('*.prj'):
rename(fname, fname[8:])
следующий код должен работать. Он принимает каждое имя файла в текущем каталоге, если имя файла содержит шаблон CHEESE_CHEESE_
затем он переименовывается. Если с именем файла ничего не сделано.
import os
for fileName in os.listdir("."):
os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
у меня такая же проблема, где я хочу заменить пробел in any pdf file to a dash
-
.
Но файлы были в нескольких подкаталогах. Итак, мне пришлось использовать os.walk()
.
В вашем случае для нескольких подкаталогов это может быть что-то вроде этого:
import os
for dpath, dnames, fnames in os.walk('/path/to/directory'):
for f in fnames:
os.chdir(dpath)
if f.startswith('cheese_'):
os.rename(f, f.replace('cheese_', ''))
попробуйте это:
import os
import shutil
for file in os.listdir(dirpath):
newfile = os.path.join(dirpath, file.split("_",1)[1])
shutil.move(os.path.join(dirpath,file),newfile)
Я предполагаю, что вы не хотите удалять расширение файла, но вы можете просто сделать то же самое разделение с периодами.
этот вид материала идеально подходит для IPython, который имеет интеграцию оболочки.
In [1] files = !ls
In [2] for f in files:
newname = process_filename(f)
mv $f $newname
Примечание: чтобы сохранить это в скрипте, используйте .ipy
расширение и префикс всех команд оболочки с !
.
см. также:http://ipython.org/ipython-doc/stable/interactive/shell.html
кажется, что ваша проблема больше в определении нового имени файла, а не самого переименования (для которого вы можете использовать ОС.переименовать метод).
из вашего вопроса неясно, что такое шаблон, который вы хотите переименовать. Нет ничего плохого в манипулировании струнами. Регулярное выражение может быть тем, что вам нужно здесь.
вот более общее решение:
этот код можно использовать для рекурсивного удаления любого конкретного символа или набора символов из всех имен файлов в каталоге и замены их любым другим символом, набором символов или без символа.
import os
paths = (os.path.join(root, filename)
for root, _, filenames in os.walk('C:\FolderName')
for filename in filenames)
for path in paths:
# the '#' in the example below will be replaced by the '-' in the filenames in the directory
newname = path.replace('#', '-')
if newname != path:
os.rename(path, newname)
эта команда удалить нач строка "Cheese" из всех файлов в текущем каталоге, используя renamer:
$ renamer --find "/^CHEESE_/" *
вы можете использовать ОС.системная функция для простоты и вызова bash для выполнения задачи:
import os
os.system('mv old_filename new_filename')
Я изначально искал какой-то GUI, который позволил бы переименовывать регулярные выражения и который имел предварительный просмотр результата перед применением изменений.
в Linux я успешно использовал помощью krename, в Windows Total Commander переименование с помощью регулярных выражений, но я не нашел достойного бесплатного эквивалента для OSX, поэтому я закончил писать скрипт python, который работает рекурсивно и по умолчанию печатает только новые имена файлов без каких-либо изменений. Добавить '- w' переключитесь, чтобы изменить имена файлов.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import fnmatch
import sys
import shutil
import re
def usage():
print """
Usage:
%s <work_dir> <search_regex> <replace_regex> [-w|--write]
By default no changes are made, add '-w' or '--write' as last arg to actually rename files
after you have previewed the result.
""" % (os.path.basename(sys.argv[0]))
def rename_files(directory, search_pattern, replace_pattern, write_changes=False):
pattern_old = re.compile(search_pattern)
for path, dirs, files in os.walk(os.path.abspath(directory)):
for filename in fnmatch.filter(files, "*.*"):
if pattern_old.findall(filename):
new_name = pattern_old.sub(replace_pattern, filename)
filepath_old = os.path.join(path, filename)
filepath_new = os.path.join(path, new_name)
if not filepath_new:
print 'Replacement regex {} returns empty value! Skipping'.format(replace_pattern)
continue
print new_name
if write_changes:
shutil.move(filepath_old, filepath_new)
else:
print 'Name [{}] does not match search regex [{}]'.format(filename, search_pattern)
if __name__ == '__main__':
if len(sys.argv) < 4:
usage()
sys.exit(-1)
work_dir = sys.argv[1]
search_regex = sys.argv[2]
replace_regex = sys.argv[3]
write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in ['--write', '-w']
rename_files(work_dir, search_regex, replace_regex, write_changes)
пример использования
Я хочу перевернуть части имени файла следующим образом, т. е. переместить бит m7-08
к началу имени файла:
# Before:
Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4
# After:
m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4
это выполнит сухой запуск и распечатает новые имена файлов без фактического переименования каких-либо файлов:
rename_files_regex.py . "([^\.]+?)-(m\d+-\d+)" "\2_\1"
это сделает фактическое переименование (вы можете использовать либо -w
или --write
):
rename_files_regex.py . "([^\.]+?)-(m\d+-\d+)" "\2_\1" --write
импорт ОС импорт строки def rename_files ():
#List all files in the directory
file_list = os.listdir("/Users/tedfuller/Desktop/prank/")
print(file_list)
#Change current working directory and print out it's location
working_location = os.chdir("/Users/tedfuller/Desktop/prank/")
working_location = os.getcwd()
print(working_location)
#Rename all the files in that directory
for file_name in file_list:
os.rename(file_name, file_name.translate(str.maketrans("","",string.digits)))
rename_files()
Как насчет этого :
import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
это работает для меня.
import os
for afile in os.listdir('.'):
filename, file_extension = os.path.splitext(afile)
if not file_extension == '.xyz':
os.rename(afile, filename + '.abc')