如果新文件不存在,则写入新文件,如果存在则附加到文件

时间:2013-12-06 20:23:51

标签: python python-3.x file append

我有一个程序将用户的highscore写入文本文件。用户在选择playername时会命名该文件。

如果具有该特定用户名的文件已存在,则该程序应附加到该文件(以便您可以看到多个highscore)。如果不存在具有该用户名的文件(例如,如果用户是新用户),则应该创建一个新文件并写入该文件。

以下是相关的,迄今为止无效的代码:

try: 
    with open(player): #player is the varible storing the username input
        with open(player, 'a') as highscore:
            highscore.write("Username:", player)

except IOError:
    with open(player + ".txt", 'w') as highscore:
        highscore.write("Username:", player)

如果新文件不存在,上面的代码会创建一个新文件并写入。如果它存在,则在检查文件时没有附加任何内容,并且我没有错误。

5 个答案:

答案 0 :(得分:51)

您是否尝试过模式' a +'?

with open(filename, 'a+') as f:
    f.write(...)

但请注意,f.tell()将在Python 2.x中返回0。有关详细信息,请参阅https://bugs.python.org/issue22651

答案 1 :(得分:27)

我不清楚您感兴趣的高分存储的确切位置,但下面的代码应该是您需要检查文件是否存在并根据需要附加到其中的代码。我更喜欢这种方法的“尝试/除外”。

import os
player = 'bob'

filename = player+'.txt'

if os.path.exists(filename):
    append_write = 'a' # append if already exists
else:
    append_write = 'w' # make a new file if not

highscore = open(filename,append_write)
highscore.write("Username: " + player + '\n')
highscore.close()

答案 2 :(得分:9)

只需以'a'模式打开它即可:

  

a开放写作。如果文件不存在,则创建该文件。流位于文件末尾。

with open(filename, 'a') as f:
    f.write(...)

要查看您是否正在写入新文件,请检查流位置。如果为零,则文件为空或为新文件。

with open('somefile.txt', 'a') as f:
    if f.tell() == 0:
        print('a new file or the file was empty')
        f.write('The header\n')
    else:
        print('file existed, appending')
    f.write('Some data\n')

如果您仍在使用Python 2,要解决the bug,请在f.seek(0, os.SEEK_END)之后添加open或改用io.open

答案 3 :(得分:2)

请注意,如果文件的父文件夹不存在,则会出现相同的错误:

IOError:[错误2]没有这样的文件或目录:

下面是处理这种情况的另一种解决方案:
(*)我使用sys.stdoutprint而非f.write只是为了展示另一个用例

# Make sure the file's folder exist - Create folder if doesn't exist
folder_path = 'path/to/'+folder_name+'/'
if not os.path.exists(folder_path):
     os.makedirs(folder_path)

print_to_log_file(folder_path, "Some File" ,"Some Content")

内部print_to_log_file仅负责文件级别:

# If you're not familiar with sys.stdout - just ignore it below (just a use case example)
def print_to_log_file(folder_path ,file_name ,content_to_write):

   #1) Save a reference to the original standard output       
    original_stdout = sys.stdout   
    
    #2) Choose the mode
    write_append_mode = 'a' #Append mode
    file_path = folder_path + file_name
    if (if not os.path.exists(file_path) ):
       write_append_mode = 'w' # Write mode
     
    #3) Perform action on file
    with open(file_path, write_append_mode) as f:
        sys.stdout = f  # Change the standard output to the file we created.
        print(file_path, content_to_write)
        sys.stdout = original_stdout  # Reset the standard output to its original value

请考虑以下状态:

'w'  --> Write to existing file
'w+' --> Write to file, Create it if doesn't exist
'a'  --> Append to file
'a+' --> Append to file, Create it if doesn't exist

在您的情况下,我将使用其他方法,而仅使用'a''a+'

答案 4 :(得分:0)

使用pathlib模块(Python的object-oriented filesystem paths

这只是踢球,也许是该解决方案的最新pythonic版本。

from pathlib import Path 

path = Path(f'{player}.txt')
path.touch()  # default exists_ok=True
with path.open('a') as highscore:
   highscore.write(f'Username:{player}')