用Python创建新的文本文件?

时间:2014-12-13 16:16:22

标签: python file

是否有一种创建文本文件的方法,而无需在“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

4 个答案:

答案 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),因为它可以避免在文件中循环两次。