如何在更改文件名时“不”更改文件扩展名?

时间:2020-11-01 15:13:53

标签: python python-3.x file extension-methods

我正在尝试从文件名中删除数字。但是这样做也会删除扩展名,并且mp4文件变成mp。有什么好的解决方案可以解决这个问题?

import os

def file_rename():
    name_list=os.listdir(r"C:\Users\caspe\OneDrive\Documents\Övrigt\Kodning\Twitch")
    print(name_list)
    saved_path=os.getcwd()
    print("Current working directory is"+saved_path)
    os.chdir(r"C:\Users\caspe\OneDrive\Documents\Övrigt\Kodning\Twitch")

    for file_name in name_list:
        print("old name"+file_name)
        print("new name"+file_name.strip("0123456789"))
        os.rename(file_name, file_name.translate(str.maketrans('','','0123456789-')))
    os.chdir(saved_path)

file_rename()

4 个答案:

答案 0 :(得分:3)

您可以使用pathlib.Path对象。它具有namesuffix属性,以及一个rename方法:

import re
from pathlib import Path
for file in Path(r'C:\tmp').glob('*'):
    if not file.is_file():
        continue
    new_name = re.sub('\d','', file.stem) + file.suffix
    file.rename(file.parent/new_name)

parent属性提供文件所属的文件夹,而is_file方法用于检查我们是否正在处理常规文件(而不是文件夹)。通过/运算符可以轻松创建新Path对象(完整的新文件路径为file.parent / new_name)。

re.sub()用于替换旧文件名\d部分中的数字(stem表示数字)。

答案 1 :(得分:0)

您可以使用re,例如

import re, os, glob

for f in glob.glob(os.path.join(yourdir,'*')):    
    old_name=os.path.basename(f)
    old_split = old_name.split('.')
    ext = old_split[-1]
    new_name=re.sub('\d','',''.join(old_split[:-1])) + '.' + ext
    new_f=os.path.join(os.path.dirname(f),new_name)
    os.rename(f, new_f)

在这里,您首先提取基本名称,然后将其拆分以获取扩展名。接下来,通过用空字符串替换旧基础名称中的所有数字来构建新基础名称,然后添加扩展名。

然后您构建完整路径并重命名文件。

答案 2 :(得分:0)

类似

remove = set("0123456789-")
fname = 'my_file1-new12.mp4'
parts = fname.split('.')
parts[0] = ''.join(x for x in parts[0] if x not in remove)
clean_fname = parts[0] + '.' + parts[1]
print(clean_fname)

输出

my_filenew.mp4

答案 3 :(得分:-1)

此简单正则表达式将在您的for循环中解决您的问题。首先将文件名放在第一个点之前,然后将其分组。然后,您可以从文件名中删除所有必需的数字以进行重命名。

    find = re.compile(r"^[^.]*")
    for file_name in name_list:
        print (re.search(find, file_name).group(0))
        new_name = re.search(find, file_name).group(0)
        print("new name are"+ new_name.strip("0123456789"))