是否有一种创建文本文件的方法,而无需在“w”或“a”模式下打开文本文件?例如,如果我想以“r”模式打开文件,但该文件不存在,那么当我捕获IOError时,我想要创建一个新文件 e.g:
while flag == True:
try:
# opening src in a+ mode will allow me to read and append to file
with open("Class {0} data.txt".format(classNo),"r") as src:
# list containing all data from file, one line is one item in list
data = src.readlines()
for ind,line in enumerate(data):
if surname.lower() and firstName.lower() in line.lower():
# overwrite the relevant item in data with the updated score
data[ind] = "{0} {1}\n".format(line.rstrip(),score)
rewrite = True
else:
with open("Class {0} data.txt".format(classNo),"a") as src:
src.write("{0},{1} : {2}{3} ".format(surname, firstName, score,"\n"))
if rewrite == True:
# reopen src in write mode and overwrite all the records with the items in data
with open("Class {} data.txt".format(classNo),"w") as src:
src.writelines(data)
flag = False
except IOError:
print("New data file created")
# Here I want a new file to be created and assigned to the variable src so when the
# while loop iterates for the second time the file should successfully open
答案 0 :(得分:0)
一开始只检查文件是否存在,如果不存在则创建文件:
filename = "Class {0} data.txt"
if not os.path.isfile(filename):
open(filename, 'w').close()
从现在开始,您可以假设该文件存在,这将大大简化您的代码。
答案 1 :(得分:0)
没有操作系统允许您创建文件而不实际写入文件。您可以将其封装在库中,以便创建不可见,但如果您真的想要修改文件系统,则无法避免写入文件系统。
这是一个快速而肮脏的open
替代品,它符合您的建议。
def open_for_reading_create_if_missing(filename):
try:
handle = open(filename, 'r')
except IOError:
with open(filename, 'w') as f:
pass
handle = open(filename, 'r')
return handle
答案 2 :(得分:0)
如果文件不存在,最好是创建文件,例如类似的东西:
import sys, os
def ensure_file_exists(file_name):
""" Make sure that I file with the given name exists """
(the_dir, fname) = os.path.split(file_name)
if not os.path.exists(the_dir):
sys.mkdirs(the_dir) # This may give an exception if the directory cannot be made.
if not os.path.exists(file_name):
open(file_name, 'w').close()
你甚至可以在打开读取和返回文件句柄之前使用safe_open
函数做类似的事情。
答案 3 :(得分:0)
问题中提供的示例代码不是很清楚,特别是因为它调用了多个未在任何地方定义的变量。但基于此,这是我的建议。您可以创建一个类似于touch + file open的功能,但这与平台无关。
def touch_open( filename):
try:
connect = open( filename, "r")
except IOError:
connect = open( filename, "a")
connect.close()
connect = open( filename, "r")
return connect
此功能将为您打开文件(如果存在)。如果文件不存在,它将创建一个具有相同名称的空白文件并将其打开。与import os; os.system('touch test.txt')
相关的额外奖励功能是它不会在shell中创建子进程,使其更快。
由于它没有使用with open(filename) as src
语法,您应该记得在最后用connection = touch_open( filename); connection.close()
关闭连接,或者最好是在for
循环中打开它。例如:
file2open = "test.txt"
for i, row in enumerate( touch_open( file2open)):
print i, row, # print the line number and content
此选项应优先于代码中的data = src.readlines()
后跟enumerate( data)
,因为它可以避免在文件中循环两次。