Как убрать точки в имени файла, не удаляя его в расширении

Предположим, я просматриваю папку, в которой есть файлы с разными расширениями (Пример: .doc, .xlsx, .ppt, .pptx). Я хочу удалить точки ('.') Из имени файла, но не из расширения. Если я просто сделаю это:

def filename_replacer(file_name):
    extension = file_name[-4:]
    raw_name = file_name[:-4]       
    new_name = raw_name.replace(".", "_")
    new_name = new_name + extension
    return new_name

file = "Remove.TheDotReport.xlsx"
cleaned_file = filename_replacer(file)

Выходит неверно (например: Remove_TheDotReport_xlxs). Как я могу последовательно удалять точки в файле, не портя расширение?

3 ответа

Использовать os.path.splitext чтобы сначала вытащить расширение.

import os

def filename_replacer(filename):
  fname, fext = os.path.splitext(filename)
  return fname.replace(".", "_") + fext

Начиная с Python 3.4, удобный способ работы с путями - это pathlib встроенная библиотека.

Начиная с Python 3.9 был добавлен новый метод, with_stemкоторый изменяет только имя файла без расширения. Так что это можно сделать довольно легко:

      from pathlib import Path

path = Path("Remove.TheDotReport.xlsx")
print(path.with_stem(path.stem.replace('.', '_')))
# Remove_TheDotReport.xlsx

Для более старых версий вы можете использовать with_name метод с немного дополнительной работой (добавление расширения отдельно):

      from pathlib import Path

path = Path("Remove.TheDotReport.xlsx")
print(path.with_name(path.stem.replace('.', '_') + path.suffix))
# Remove_TheDotReport.xlsx

Это для сценария bash, чтобы удалить точки из имени файла и сохранить точку расширения, если вы хотите изменить любой файл ( 'dir /b *.filename') укажите здесь имя файла.

      @echo off
for /f "delims=" %%a in ('dir /b *') do call :dot "%%a"
pause
goto :EOF
:dot
set "var=%~n1"
set "var=%var:.= %"
ren %1 "%var%%~x1"
Другие вопросы по тегам