【问题标题】:Python Regex or Filename FunctionPython 正则表达式或文件名函数
【发布时间】:2025-12-05 10:45:01
【问题描述】:

关于重命名文件夹中的文件名的问题。我的文件名如下所示:

EPG CRO 24 Kitchen 09.2013.xsl

之间有名称空间,我使用了这样的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Remove whitespace from files where EPG named with space " " replace with "_"
for filename in os.listdir("."):
    if filename.find("2013|09 ") > 0:
        newfilename = filename.replace(" ","_")
        os.rename(filename, newfilename)

使用此代码,我删除了空格,但是如何从文件名中删除日期,使其看起来像这样:EPG_CRO_24_Kitche.xsl。你能给我一些解决方案吗?

【问题讨论】:

    标签: python regex file text


    【解决方案1】:

    正则表达式

    正如 utdemir 所逃避的那样,正则表达式在这种情况下确实可以提供帮助。如果您从未接触过它们,一开始可能会感到困惑。查看https://www.debuggex.com/r/4RR6ZVrLC_nKYs8g 以获取帮助您构建正则表达式的有用工具。

    解决方案

    更新的解决方案是:

    import re
    
    def rename_file(filename):
      if filename.startswith('EPG') and ' ' in filename:
        # \s+       means 1 or more whitespace characters                                   
        # [0-9]{2}  means exactly 2 characters of 0 through 9                               
        # \.        means find a '.' character                                              
        # [0-9]{4}  means exactly 4 characters of 0 through 9                               
        newfilename = re.sub("\s+[0-9]{2}\.[0-9]{4}", '', filename)
        newfilename = newfilename.replace(" ","_")
        os.rename(filename, newfilename)
    

    旁注

    # Remove whitespace from files where EPG named with space " " replace with "_"
    for filename in os.listdir("."):
        if filename.find("2013|09 ") > 0:
            newfilename = filename.replace(" ","_")
            os.rename(filename, newfilename)
    

    除非我弄错了,否则您在上面的评论中,filename.find("2013|09 ") > 0 将不起作用。

    鉴于以下情况:

    In [76]: filename = "EPG CRO 24 Kitchen 09.2013.xsl"
    In [77]: filename.find("2013|09 ")
    Out[77]: -1
    

    你描述的评论,你可能想要更像:

    In [80]: if filename.startswith('EPG') and ' ' in filename:
       ....:     print('process this')
       ....:     
    process this
    

    【讨论】:

    • 当我在上面运行代码时,我只得到了一些文件,但其他的保持不变。
    • 不客气。我很高兴这有帮助。您能否提供 os.listdir('.') 的输出,以便我知道文件名是什么?
    【解决方案2】:

    如果所有文件名格式相同:NAME_20XX_XX.xsl,那么可以使用python的列表slicing代替regex

    name.replace(' ','_')[:-12] + '.xsl'
    

    【讨论】:

      【解决方案3】:

      如果日期的格式始终相同;

      >>> s = "EPG CRO 24 Kitchen 09.2013.xsl"
      >>> re.sub("\s+\d{2}\.\d{4}\..{3}$", "", s)
      'EPG CRO 24 Kitchen'
      

      【讨论】:

      • 日期是飞蛾,所以下个月就像 EPG CRO 24 Kitchen 10.2013.xsl
      • 此正则表达式匹配:* 一个或多个空格 * 后跟两位数、一个点、四位数字、* 后跟一个点和三个字符(扩展名)* 和字符串结尾。
      【解决方案4】:

      小切片怎么样:

      newfilename = input1[:input1.rfind(" ")].replace(" ","_")+input1[input1.rfind("."):]
      

      【讨论】: