Как изменить несколько имен файлов в каталоге с помощью Python


Я изучаю Python, и мне было поручено:

  • добавление "file_" в начало каждого имени в каталоге
  • изменение расширения (в настоящее время каталог содержит 4 различных типа:. py, .ТЕКСТ, .формат RTF, .текст)
У меня много файлов, все с разными именами, каждый длиной в 7 символов. Я смог изменить расширения, но он чувствует себя очень неуклюжим. Я уверен, что есть более чистый способ написать следующее (но его функционирование, так что никаких жалоб на это Примечание):
    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)

У меня все еще есть небольшая проблема:

  1. скрипт в данный момент должен находиться в моем каталоге, чтобы он мог работать.
  2. Я не могу понять, как добавить "file_" в начало каждого из имен файлов [вы могли бы подумать, что это будет легкая часть]. Я попытался объявить newname как

    newname = 'file_' + str(filename)
    

    Затем он заявляет, что имя файла не определено.

Любая помощь по двум моим существующим вопросам будет весьма признательна.

4 4

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')

Используйте массив для хранения всех старых расширений и перебора их.