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

时间:2016-01-23 06:22:36

标签: python file-handling

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

  • 将“file_”添加到目录中每个名称的开头
  • 更改扩展名(目录目前包含4种不同类型:.py,.TEXT,.rtf,.text)

我有很多文件,都有不同的名字,每个长7个字符。我能够改变扩展,但感觉非常笨重。我很肯定有一种更清洁的方式来写下面的内容(但它的功能,所以没有对该注释的投诉):

    import os, sys
    path = 'C:/Users/dana/Desktop/text_files_2/'
        for filename in os.listdir(path):
            if filename.endswith('.rtf'):
                newname = filename.replace('.rtf', '.txt')
                os.rename(filename, newname)
        elif filename.endswith('.py'):
                newname = filename.replace('.py', '.txt')
                os.rename(filename, newname)
        elif filename.endswith('.TEXT'):
                newname = filename.replace('.TEXT', '.txt')
                os.rename(filename, newname)
        elif filename.endswith('.text'):
               newname = filename.replace('.text', '.txt')
               os.rename(filename, newname)

我仍有一些问题:

  1. 脚本当前必须位于我的目录中才能运行。
  2. 我无法弄清楚如何将“file_”添加到每个文件名的开头[你认为这将是简单的部分]。我已经尝试将newname声明为

    newname = 'file_' + str(filename)
    

    然后声明文件名未定义。

  3. 对我现有的两个问题的任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

使用os.path.join()提供完整路径名称:

os.rename(os.path.join(path, filename), os.path.join(name, newname))

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

您可以进一步简化您的计划:

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语句。

答案 2 :(得分:1)

import glob, os

path = 'test/'# your path
extensions = ['.rtf', '.py', '.TEXT', '.text']
for file in glob.glob(os.path.join(path, '*.*')):
    file_path, extension = os.path.splitext(file)
    if extension in extensions:
        new_file_name = '{0}.txt'.format(
            os.path.basename(file_path)
        )
    if not new_file_name.startswith('file_'): # check if file allready has 'file_' at beginning
        new_file_name = 'file_{0}'.format( # if not add 
                new_file_name
        )

    new_file = os.path.join(
            os.path.dirname(file_path),
            new_file_name
    )

    os.rename(file, new_file)
  • file_path, extension = os.path.splitext(file)获取没有扩展名和扩展名的文件路径f.e ('dir_name/file_name_without_extension','.extension')
  • os.path.dirname(file_path)获取目录f.e如果file_path是dir1/dir2/file.ext,结果将为'dir1/dir2'
  • os.path.basename(file_path)获取没有扩展名的文件名

答案 3 :(得分:0)

 - Api

 - Assets 
    --> images
    --> js
         --> controllers
              -->indexCtrl.js
         --> dependencies
         --> directives
         --> services
         --> app.js
    --> styles
    --> templates
    --> views


 - Config

 - node_modules

 - tasks

 - views
    -->index.ejs

使用数组存储所有旧扩展并迭代它们。