Ich habe ein Programm, das einen Benutzer highscore
in eine Textdatei schreibt . Die Datei wird vom Benutzer benannt, wenn er a auswählt playername
.
Wenn die Datei mit diesem bestimmten Benutzernamen bereits vorhanden ist, sollte das Programm an die Datei angehängt werden (damit Sie mehr als eine sehen können highscore
). Wenn eine Datei mit diesem Benutzernamen nicht vorhanden ist (z. B. wenn der Benutzer neu ist), sollte eine neue Datei erstellt und in diese geschrieben werden.
Hier ist der relevante, bisher nicht funktionierende Code:
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)
Der obige Code erstellt eine neue Datei, falls diese nicht vorhanden ist, und schreibt in sie. Wenn es existiert, wurde beim Überprüfen der Datei nichts angehängt, und es werden keine Fehler angezeigt.
python
python-3.x
file
append
Bondenn
quelle
quelle
with open(player):
Aussage? Außerdem erstellen Sie in Ihrem Ausnahmebehandler eine andere Dateiplayer + '.txt'
als die, in die Sie ursprünglich schreiben wollten.open(whatever,'a') as highscore:
, und es wird tun, was Sie wollen: Erstellen Sie die Datei, wenn sie nicht vorhanden ist, oder hängen Sie sie an, wenn sie vorhanden istAntworten:
Mir ist nicht klar, wo genau der Highscore gespeichert ist, an dem Sie interessiert sind, aber der folgende Code sollte genau das sein, was Sie benötigen, um zu überprüfen, ob die Datei vorhanden ist, und um sie gegebenenfalls anzufügen. Ich ziehe diese Methode dem "try / Except" vor.
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()
quelle
open(filename, 'a')
, es erstellt auch die Datei, wenn nicht vorhanden, und anhängen, wenn vorhanden.Haben Sie den Modus 'a +' ausprobiert?
with open(filename, 'a+') as f: f.write(...)
Beachten Sie jedoch, dass
f.tell()
in Python 2.x 0 zurückgegeben wird. Siehe https://bugs.python.org/issue22651 Informationen finden .quelle
f.tell()
" gemeldeten Wert befassen "voranstellen müssen .a+
aus diesem Grund in den Dokumenten :on some Unix systems means that all writes append to the end of the file regardless of the current seek position
.'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position).
Ich denke, dies ist für die meisten Verwendungen von Dateien in Ordnung (zum Beispiel immer anhängen). Wenn Sie nach bestimmten Offsets suchen müssen, werden Sie Dateien wahrscheinlich sowieso nicht auf diese Weise öffnen.a
unda+
auf Mac OS High Sierra unter Python 2.7.15 ausprobiert und beide an das Ende der Datei angehängt und in beidenf.tell()
das gleiche gemeldet (nicht 0). Der verknüpfte Fehler hat auch einige tragbare Problemumgehungen, z. B. setzen Sie die Suchposition manuell auf das Ende der Datei oder verwenden Sieio
stattdessen das Modul, das diesen Fehler nicht aufweist.a+
wenn du nur kannsta
?Öffnen Sie es einfach im
'a'
Modus:with open(filename, 'a') as f: f.write(...)
Überprüfen Sie die Stream-Position, um festzustellen, ob Sie in eine neue Datei schreiben. Wenn es Null ist, war entweder die Datei leer oder es handelt sich um eine neue Datei.
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')
Wenn Sie immer noch Python 2 verwenden, um den Fehler zu umgehen , fügen Sie entweder
f.seek(0, os.SEEK_END)
direkt danach hinzuopen
oder verwenden Sieio.open
stattdessen.quelle
Beachten Sie, dass der gleiche Fehler angezeigt wird, wenn der übergeordnete Ordner der Datei nicht vorhanden ist:
Unten ist eine andere Lösung, die diesen Fall behandelt:
(*) Ich habe verwendet
sys.stdout
undprint
anstattf.write
nur einen anderen Anwendungsfall zu zeigen# 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")
Wo sich der Interne
print_to_log_file
nur um die Dateiebene kümmert:# 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
Betrachten Sie die folgenden Zustände:
'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
In Ihrem Fall würde ich einen anderen Ansatz verwenden und nur
'a'
und verwenden'a+'
.quelle
Verwenden des
pathlib
Moduls ( objektorientierte Dateisystempfade von Python )Nur zum Spaß ist dies vielleicht die neueste pythonische Version der Lösung.
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}')
quelle