Python更改文件名

时间:2016-02-23 18:08:11

标签: python-3.x

我的应用程序提供了用户导出其结果的功能。我的应用程序导出名称为Exp_Text_1Exp_Text_2等的文本文件。我想要它,以便在Desktop中预先存在具有相同文件名的文件,然后从该数字开始向上计数。例如,如果名称为Exp_Text_3的文件已在桌面中,那么我希望创建的文件名为Exp_Text_4

这是我的代码:

if len(str(self.Output_Box.get("1.0", "end"))) == 1:
            self.User_Line_Text.set("Nothing to export!")
        else:
            import os.path

            self.txt_file_num = self.txt_file_num + 1
            file_name = os.path.join(os.path.expanduser("~"), "Desktop", "Exp_Txt" + "_" + str(self.txt_file_num) + ".txt")

            file = open(file_name, "a")
            file.write(self.Output_Box.get("1.0", "end"))
            file.close()

            self.User_Line_Text.set("A text file has been exported to Desktop!")

1 个答案:

答案 0 :(得分:1)

你可能想要os.path.exists

>>> import os
>>> help(os.path.exists)
Help on function exists in module genericpath:

exists(path)
    Test whether a path exists.  Returns False for broken symbolic links

一个非常基本的例子是创建一个带有格式标记的文件名,以插入多个检查的数字:

import os

name_to_format = os.path.join(os.path.expanduser("~"), "Desktop", "Exp_Txt_{}.txt")
#the "{}" is a formatting mark so we can do file_name.format(num)

num = 1
while os.path.exists(name_to_format.format(num)):
    num+=1

new_file_name = name_to_format.format(num)

这将检查以Exp_Txt_1.txt开头的所有文件名,然后检查Exp_Txt_2.txt等,直到找到不存在的文件名。

但是,如果大括号{}是路径其余部分的一部分,则格式标记可能会导致问题,因此最好执行以下操作:

import os

def get_file_name(num):
    return os.path.join(os.path.expanduser("~"), "Desktop", "Exp_Txt_" + str(num) + ".txt")

num = 1
while os.path.exists(get_file_name(num)):
    num+=1

new_file_name = get_file_name(num)

编辑:在第一个示例中回答为什么我们不需要get_file_name功能?

首先,如果您不熟悉str.format,可能需要查看Python doc - common string operations和/或这个简单示例:

text = "Hello {}, my name is {}."
x = text.format("Kotropoulos","Tadhg")
print(x)
print(text)

路径字符串用这一行计算出来:

 name_to_format = os.path.join(os.path.expanduser("~"), "Desktop", "Exp_Txt_{}.txt")

但它有{}代替所需的数字。 (因为我们现在不知道该数字应该是多少)所以如果路径是例如:

 name_to_format = "/Users/Tadhg/Desktop/Exp_Txt_{}.txt"

然后我们可以插入一个数字:

print(name_to_format.format(1))
print(name_to_format.format(2))

并且这不会更改name_to_format,因为str个对象为Immutable,因此.format会返回新字符串,而不会修改name_to_format。但是,如果输出路径是这样的话,我们会遇到问题:

 name_to_format = "/Users/Bob{Cat}/Desktop/Exp_Txt_{}.txt"
 #or
 name_to_format = "/Users/Bobcat{}/Desktop/Exp_Txt_{}.txt"
 #or
 name_to_format = "/Users/Smiley{:/Desktop/Exp_Txt_{}.txt"

由于我们想要使用的格式标记不再是唯一的大括号,我们可以得到各种错误:

 KeyError: 'Cat'
 IndexError: tuple index out of range
 ValueError: unmatched '{' in format spec

因此,当您知道使用安全时,您只想依赖str.format。希望这有帮助,有趣的编码!