我想将 a.txt
更改为 b.kml
。
使用 os.rename
:
import os
os.rename('a.txt', 'b.kml')
用法:
os.rename('from.extension.whatever','to.another.extension')
文件可能在目录中,在这种情况下指定路径:
import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
从 Python 3.4 开始,可以使用 pathlib 模块来解决这个问题。
如果您碰巧使用的是旧版本,则可以使用找到的反向移植版本 here
假设你不在要重命名的根路径(只是给它增加一点难度),并且必须提供完整路径,我们可以看看这个:
some_path = 'a/b/c/the_file.extension'
因此,您可以根据自己的路径创建一个 Path
对象:
from pathlib import Path
p = Path(some_path)
只是为了提供一些关于我们现在拥有的这个对象的信息,我们可以从中提取一些东西。例如,如果出于某种原因我们想通过将文件名从 the_file
修改为 the_file_1
来重命名文件,那么我们可以获得文件名部分:
name_without_extension = p.stem
并且仍然将扩展名握在手中:
ext = p.suffix
我们可以通过简单的字符串操作来执行修改:
Python 3.6 及更高版本使用 f 字符串!
new_file_name = f"{name_without_extension}_1"
否则:
new_file_name = "{}_{}".format(name_without_extension, 1)
现在我们可以通过在我们创建的路径对象上调用 rename
方法并附加 ext
来完成我们想要的正确重命名结构:
p.rename(Path(p.parent, new_file_name + ext))
更简短地展示它的简单性:
Python 3.6+:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
低于 Python 3.6 的版本改为使用字符串格式方法:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
pathlib
库是在 python 3.4 中引入的,因此在这里分享答案也为一个可靠的模块提供了曝光,以展示它的多功能性和用于更复杂要求的用途。
{}
用于字符串格式,您可以阅读有关 here 的信息。最终,发生的事情是 {}
被传递给 format
方法的变量替换。所以第一个 {}
将保存 name_without_extension
中的内容,第二个将保存第二个参数,即 1
。
import shutil
shutil.move('a.txt', 'b.kml')
这将用于重命名或移动文件。
shutil.move
不是一个好的选择,因为它不是原子操作。例如,如果文件已打开,shutil.move
将创建一个带有 new_name
的文件,但不会删除带有 old_name
的文件,因此留下两个文件。另一方面,os.rename
什么都不做,这是一个更好的选择。使用 shutil.move
,即使您发现了错误,您仍然需要担心检查和删除恶意文件。当存在更好的工具时不值得:os.rename
。
pathlib
和 Path
的行为并重命名打开的 - windows - 文件会很有趣。
使用 os.rename
。但是您必须将两个文件的完整路径传递给函数。如果我的桌面上有一个文件 a.txt
,我会这样做,而且我也必须提供完整的重命名文件。
os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
从 Python 3.3 及更高版本开始,通常首选使用 os.replace
而不是 os.rename
,因此如果目标文件已存在,则不会引发 FileExistsError
。
assert os.path.isfile('old.txt')
assert os.path.isfile('new.txt')
os.rename('old.txt', 'new.txt')
# Raises FileExistsError
os.replace('old.txt', 'new.txt')
# Does not raise exception
assert not os.path.isfile('old.txt')
assert os.path.isfile('new.txt')
请参阅 documentation。
这里要注意的一点是,我们应该检查是否存在任何具有新文件名的文件。
假设如果 b.kml 文件存在,那么重命名具有相同文件名的其他文件会导致删除现有的 b.kml。
import os
if not os.path.exists('b.kml'):
os.rename('a.txt','b.kml')
try
/except
或 os.replace
中使用 os.rename
。
import os
# Set the path
path = 'a\\b\\c'
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in
os.chdir(saved_cwd)
chdir()
到一个目录,例如当它是一个 UNC 在 Windows 下会发生什么?并且执行 chdir()
有副作用。我宁愿直接指定 os.rename()
的必要路径,而不是 chdir()
。
使用 Pathlib 库的 Path.rename 而不是 os.rename:
import pathlib
original_path = pathlib.Path('a.txt')
new_path = original_path.rename('b.kml')
os.rename
与 pathlib
对象一起使用。
这是一个仅使用 pathlib
而不触及 os
的示例,它基于字符串 replace
操作更改目录中所有文件的名称,而不使用字符串连接:
from pathlib import Path
path = Path('/talend/studio/plugins/org.talend.designer.components.bigdata_7.3.1.20200214_1052\components/tMongoDB44Connection')
for p in path.glob("tMongoDBConnection*"):
new_name = p.name.replace("tMongoDBConnection", "tMongoDB44Connection")
new_name = p.parent/new_name
p.rename(new_name)
import shutil
import os
files = os.listdir("./pics/")
for key in range(0, len(files)):
print files[key]
shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")
这应该这样做。蟒蛇 3+
print files[key]
和“python 3+”?
如果您使用的是 Windows,并且想要重命名文件夹中的 1000 个文件,那么:您可以使用以下代码。 (Python3)
import os
path = os.chdir(input("Enter the path of the Your Image Folder : ")) #Here put the path of your folder where your images are stored
image_name = input("Enter your Image name : ") #Here, enter the name you want your images to have
i = 0
for file in os.listdir(path):
new_file_name = image_name+"_" + str(i) + ".jpg" #here you can change the extention of your renmamed file.
os.rename(file,new_file_name)
i = i + 1
input("Renamed all Images!!")
os.chdir(r"D:\Folder1\Folder2") os.rename(src,dst) #src和dst应该在Folder2里面
import os
import re
from pathlib import Path
for f in os.listdir(training_data_dir2):
for file in os.listdir( training_data_dir2 + '/' + f):
oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
p=oldfile
p.rename(newfile)
os.path
与现代 pathlib
混合是相当不确定的。改为使用 pathlib
。
您可以使用 os.system 调用终端来完成任务:
os.system('mv oldfile newfile')
mv
是用于移动/重命名文件的 unix 内置命令行程序。
不定期副业成功案例分享
C:/folder/file.txt
或 Linux 上的/home/file.txt
)苹果系统)。OSError
而失败。os.path.exists
应该用于在重命名之前检查目标是否存在。这确实会产生“检查时间到使用时间”错误,但不太可能导致问题。 (我知道解决这个问题没有简单的方法 - 请参阅 here。os.replace