Как убрать точки в имени файла, не удаляя его в расширении
Предположим, я просматриваю папку, в которой есть файлы с разными расширениями (Пример: .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"