Как изменить несколько имен файлов в каталоге с помощью Python
Я изучаю Python, и мне было поручено:
- добавление "file_" в начало каждого имени в каталоге
- изменение расширения (в настоящее время каталог содержит 4 различных типа:. py, .ТЕКСТ, .формат RTF, .текст)
import os, sys
path = 'C:/Users/dana/Desktop/text_files_2/'
for filename in os.listdir(path):
if filename.endswith('.rtf'):
newname = filename.replace('.rtf', '.txt')
os.rename(filename, newname)
elif filename.endswith('.py'):
newname = filename.replace('.py', '.txt')
os.rename(filename, newname)
elif filename.endswith('.TEXT'):
newname = filename.replace('.TEXT', '.txt')
os.rename(filename, newname)
elif filename.endswith('.text'):
newname = filename.replace('.text', '.txt')
os.rename(filename, newname)
У меня все еще есть небольшая проблема:
- скрипт в данный момент должен находиться в моем каталоге, чтобы он мог работать.
-
Я не могу понять, как добавить "file_" в начало каждого из имен файлов [вы могли бы подумать, что это будет легкая часть]. Я попытался объявить newname как
newname = 'file_' + str(filename)
Затем он заявляет, что имя файла не определено.
Любая помощь по двум моим существующим вопросам будет весьма признательна.
4 ответа:
Основная идея заключается в том, чтобы сначала получить часть расширения файла и часть реального имени файла, а затем поместить имя файла в новую строку.
os.path.splitext(p)
метод поможет получить расширения файлов, например:os.path.splitext('hello.world.aaa.txt')
вернет['hello.world.aaa', '.txt']
, он будет игнорировать ведущие точки.Поэтому в данном случае это можно сделать так:
import os import sys path = 'C:/Users/dana/Desktop/text_files_2/' for filename in os.listdir(path): filename_splitext = os.path.splitext(filename) if filename_splitext[1] in ['.rtf', '.py', '.TEXT', '.text']: os.rename(os.path.join(path, filename), os.path.join(path, 'file_' + filename_splitext[0] + '.txt'))
Укажите полное имя пути с помощью
os.path.join()
:os.rename(os.path.join(path, filename), os.path.join(name, newname))
И вы можете запустить свою программу из любого каталога.
Вы можете далее просто свою программу:
extensions = ['.rtf', '.py', '.TEXT', '.text'] for extension in extensions: if filename.endswith(extension): newname = filename.replace(extension, '.txt') os.rename(os.path.join(path, filename), os.path.join(path, newname)) break
Все остальные утверждения
elif
больше не нужны.
import glob, os path = 'test/'# your path extensions = ['.rtf', '.py', '.TEXT', '.text'] for file in glob.glob(os.path.join(path, '*.*')): file_path, extension = os.path.splitext(file) if extension in extensions: new_file_name = '{0}.txt'.format( os.path.basename(file_path) ) if not new_file_name.startswith('file_'): # check if file allready has 'file_' at beginning new_file_name = 'file_{0}'.format( # if not add new_file_name ) new_file = os.path.join( os.path.dirname(file_path), new_file_name ) os.rename(file, new_file)
file_path, extension = os.path.splitext(file)
Получение пути к файлу без расширения и расширения f. e('dir_name/file_name_without_extension','.extension')
os.path.dirname(file_path)
Получение каталога f. e, если file_path равенdir1/dir2/file.ext
результат будет'dir1/dir2'
os.path.basename(file_path)
получение имени файла без расширения
import os, sys path = 'data' // Initial path def changeFileName( path, oldExtensions, newExtension ): for name in os.listdir(path): for oldExtension in oldExtensions: if name.endswith(oldExtension): name = os.path.join(path, name) newName = name.replace(oldExtension, newExtension) os.rename(name, newName) break; if __name__ == "__main__": changeFileName( 'data', ['.py', '.rtf' , '.text', '.TEXT'], '.txt')
Используйте массив для хранения всех старых расширений и перебора их.