我的应用程序提供了用户导出其结果的功能。我的应用程序导出名称为Exp_Text_1
,Exp_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!")
答案 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
。希望这有帮助,有趣的编码!