如何使用 Python 更改目录中的多个文件名
How to change multiple filenames in a directory using Python
我正在学习 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)
我还有一点问题:
- 脚本当前必须在我的目录中才能运行。
我不知道如何将 "file_" 添加到每个文件名的开头 [你会认为这是简单的部分].我尝试将新名称声明为
newname = 'file_' + str(filename)
然后声明文件名未定义。
如果能就我现有的两个问题提供任何帮助,我们将不胜感激。
提供完整路径名 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
语句。
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')
将 return ['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'))
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)
获取不带扩展名的文件名
我正在学习 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)
我还有一点问题:
- 脚本当前必须在我的目录中才能运行。
我不知道如何将 "file_" 添加到每个文件名的开头 [你会认为这是简单的部分].我尝试将新名称声明为
newname = 'file_' + str(filename)
然后声明文件名未定义。
如果能就我现有的两个问题提供任何帮助,我们将不胜感激。
提供完整路径名 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
语句。
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')
将 return ['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'))
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)
获取不带扩展名的文件名