如何使用Python更改目录中的多个文件名

如何使用Python更改目录中的多个文件名,python,file-handling,Python,File Handling,我正在学习Python,我的任务是: 将“文件”添加到目录中每个名称的开头 更改扩展名(目录当前包含4种不同类型:.py、.TEXT、.rtf、.TEXT) 我有很多文件,都有不同的名字,每个7个字符长。我可以更改扩展,但感觉很笨重。我确信有一种更干净的方法来写以下内容(但它的功能,因此没有关于该注释的投诉): 我还是有点问题: 脚本当前必须在我的目录中才能运行 我不知道如何在每个文件名的开头加上“file_u”[你会认为这是最简单的部分]。我已经试着把newname声明为 newname

我正在学习Python,我的任务是:

  • 将“文件”添加到目录中每个名称的开头
  • 更改扩展名(目录当前包含4种不同类型:.py、.TEXT、.rtf、.TEXT)
我有很多文件,都有不同的名字,每个7个字符长。我可以更改扩展,但感觉很笨重。我确信有一种更干净的方法来写以下内容(但它的功能,因此没有关于该注释的投诉):

我还是有点问题:

  • 脚本当前必须在我的目录中才能运行
  • 我不知道如何在每个文件名的开头加上“file_u”[你会认为这是最简单的部分]。我已经试着把newname声明为

    newname = 'file_' + str(filename)
    
    然后声明文件名未定义


  • 非常感谢您对我的两个现有问题提供的任何帮助。

    请使用
    os.path.join()提供完整的路径名。

    您可以从任何目录运行您的程序

    您可以进一步简化您的程序:

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

    使用数组来存储所有旧的扩展并遍历它们

    基本思想是首先获取文件扩展名部分和真实文件名部分,然后将文件名放入新字符串中

    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'))
    
    导入全局操作系统
    路径='test/'#您的路径
    扩展名=['.rtf'、'.py'、'.TEXT'、'.TEXT']
    对于glob.glob(os.path.join(路径'*.'))中的文件:
    文件路径,扩展名=os.path.splitext(文件)
    如果扩展中包含扩展:
    新文件名='{0}.txt'。格式(
    os.path.basename(文件路径)
    )
    如果不是新的_file _name.startswith('file)):#检查文件allready的开头是否有'file u'
    新建文件名='file{0}'。格式(#如果不添加
    新文件名
    )
    新建_文件=os.path.join(
    os.path.dirname(文件路径),
    新文件名
    )
    重命名(文件,新文件)
    
    • file\u path,extension=os.path.splitext(file)
      获取不带扩展名的文件路径和扩展名f.e
      ('dir\u name/file\u name\u不带扩展名','.extension')
    • os.path.dirname(file\u path)
      如果file\u path是
      dir1/dir2/file.ext,则获取目录f.e
      结果将是
      'dir1/dir2'
    • os.path.basename(文件路径)
      获取不带扩展名的文件名

    newname='file.'+filename
    应该可以工作。您不需要使用
    str()
    ,因为
    filename
    已经引用了一个字符串,但即使如此,它也应该可以工作。也许你是在循环之外尝试的?你是对的,它在我的循环之外。另一条评论:发布代码时请小心缩进。您知道这在Python中是至关重要的。例如,显示的代码将不会按原样编译。尝试此操作后,名称将被取消定义。声明这些扩展要简单得多-感谢您的建议。回溯(最近一次呼叫上次):文件“C:/Users/dana/Desktop/scott_suffix_change2.py”,第16行,os.rename(os.path.join(path,filename),os.path.join(name,newname))name错误:名称“name”未定义抱歉。打字错误更新了我的答案。不是
    name
    ,而是
    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')
    
    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'))