open () in Python erstellt keine Datei, wenn sie nicht vorhanden ist


660

Was ist der beste Weg, um eine Datei als Lese- / Schreibzugriff zu öffnen, wenn sie vorhanden ist oder nicht, erstellen Sie sie und öffnen Sie sie als Lese- / Schreibzugriff? Nach dem, was ich gelesen habe, file = open('myfile.dat', 'rw')sollte ich das tun, oder?

Es funktioniert bei mir nicht (Python 2.6.2) und ich frage mich, ob es sich um ein Versionsproblem handelt oder ob es nicht so funktionieren soll oder was.

Unter dem Strich brauche ich nur eine Lösung für das Problem. Ich bin neugierig auf die anderen Sachen, aber alles was ich brauche ist eine schöne Art den Eröffnungsteil zu machen.

Das einschließende Verzeichnis war für Benutzer und Gruppe beschreibbar, nicht für andere (ich bin auf einem Linux-System ... also Berechtigungen 775 mit anderen Worten), und der genaue Fehler war:

IOError: Keine solche Datei oder kein solches Verzeichnis.


2
Wie S.Mark erwähnte, sollte dies "einfach funktionieren". Ist das beiliegende Verzeichnis beschreibbar?
Rakis

10
"es funktioniert nicht bei mir"? Was bedeutet das konkret? Bitte geben Sie die eigentliche Fehlermeldung an.
S.Lott

5
Die Antwort von muksie unten funktionierte (und auch die von baloo), aber der Vollständigkeit halber war das einschließende Verzeichnis von Benutzer und Gruppe beschreibbar, nicht von anderen (ich bin auf einem Linux-System ... also Berechtigungen 775 mit anderen Worten) und genau Fehler war IOError: keine solche Datei oder Verzeichnis. Danke für die Hilfe Jungs.
trh178

@ S.Lott: fertig. Das tut mir leid.
trh178

Stellen Sie sicher, dass alle führenden Ordner von filevorhanden sind.
Jason Goal

Antworten:


804

Sie sollten openmit dem w+Modus verwenden:

file = open('myfile.dat', 'w+')

108
wschneidet vorhandene Datei ab. docs: Modi 'r+', 'w+'und 'a+'öffnen Sie die Datei für die Aktualisierung (beachten Sie, dass 'w+'Schneidet die Datei).
SilentGhost

4
das hat den Trick gemacht. Vielen Dank. Ich fühle mich jetzt wie ein Idiot, weil ich die Spezifikation nicht gelesen habe. Ich glaube nicht, dass 'rw' dort überhaupt akzeptabel ist. Ich muss an etwas anderes gedacht haben.
trh178

71
Beachten Sie, dass ein + eine Datei erstellt, wenn sie nicht vorhanden ist, und die Datei entscheidend bis zum Ende sucht. Wenn Sie also sofort nach dem Öffnen auf diese Weise lesen, erhalten Sie nichts. Sie müssen zuerst zum Anfang zurückkehren: f.seek (0)
Nick Zalutskiy


120
Dies ist nicht die Lösung. Das Problem ist das Verzeichnis . Entweder fehlen dem Skript die Berechtigungen zum Erstellen einer Datei in diesem Verzeichnis, oder das Verzeichnis existiert einfach nicht. open('myfile.dat', 'w')ist dann genug.
Daniel F

137

Der Vorteil des folgenden Ansatzes besteht darin, dass die Datei am Ende des Blocks ordnungsgemäß geschlossen wird , selbst wenn unterwegs eine Ausnahme ausgelöst wird. Es ist äquivalent zu try-finally, aber viel kürzer.

with open("file.dat","a+") as f:
    f.write(...)
    ...

a + Öffnet eine Datei zum Anhängen und Lesen. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Die Datei wird im Anhänge-Modus geöffnet. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt. - Python-Dateimodi

Die Methode seek () legt die aktuelle Position der Datei fest.

f.seek(pos [, (0|1|2)])
pos .. position of the r/w pointer
[] .. optionally
() .. one of ->
  0 .. absolute position
  1 .. relative position to current
  2 .. relative position from end

Es sind nur "rwab +" - Zeichen zulässig. Es muss genau eines von "rwa" geben - siehe Detail zum Stapelüberlauf Python-Dateimodi .


1
Ich versuche dies mit open (Dateiname, 'a +') als myfile: und erhalte IOError: [Errno 2] Keine solche Datei oder kein solches Verzeichnis: - warum wird die Datei nicht erstellt?
Loretta

@ Loretta Hast du den Wert von überprüft filename?
Qwerty

Ja, habe ich. Es ist eine Unicode-Zeichenfolge. Ich habe es auch mit open ('{}. Txt'.format (Dateiname),' a + ') als myfile versucht:
Loretta

Ich benutze keinen Pfad. und ich habe versucht zu öffnen ('test.txt', 'a +') es bekommt folgende Ausnahme 'TypeError: Erzwingen zu Unicode: brauche String oder Puffer, Datei gefunden' in der Zeile wenn os.stat (myfile) .st_size == 0:
Loretta

Sie müssen die Codierung richtig definieren, damit dies funktioniert. stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

31

Es wird empfohlen, Folgendes zu verwenden:

import os

writepath = 'some/path/to/file.txt'

mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
    f.write('Hello, world!\n')

18
Es ist schlecht, eine Datei vor dem Öffnen zu testen, da dies zu Rennbedingungen führen kann (Datei wird vor dem Öffnen gelöscht). Rennbedingungen können manchmal verwendet werden, um Schwachstellen in einem System auszunutzen. Der Modus "a +" ist der beste Weg, um die Datei zu öffnen: Er erstellt eine neue Datei und hängt an vorhandene Dateien an. Vergessen Sie nicht, dies in einen Versuch / außer zu wickeln.
Sleblanc

Rechenmodus Schreiben oder Anhängen hat kein Interesse. Wenn die Datei nicht vorhanden ist, wird sie im Append-Modus erstellt.
Jean-François Fabre


25
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

r + bedeutet Lesen / Schreiben



38
Schlimmer noch, dieser Code ist anfällig für eine Rennbedingung. Nachdem überprüft wurde, ob die Datei vorhanden ist, kann der Prozess unterbrochen werden und ein anderer Prozess kann diese Datei erstellen.
Antibus

Sie benötigen außerdem das Flag "w +", damit sich beide Dateien im Lese- und Schreibmodus befinden.
Der Matt

14

Seit 3.4 Python Sie sollten verwenden pathlibzu „berühren“ -Dateien.
Es ist eine viel elegantere Lösung als die in diesem Thread vorgeschlagenen.

from pathlib import Path

filename = Path('myfile.txt')
filename.touch(exist_ok=True)  # will create file, if it exists will do nothing
file = open(filename)

Gleiches gilt für Verzeichnisse:

filename.mkdir(parents=True, exist_ok=True)

2
touchaktualisiert die zuletzt geänderte Zeit bei Verwendung.
David Parks

@DavidParks guter Punkt, habe es gerade getestet und es ist in der Tat auf ext4-Dateisystem und Python3.7.2 wahr. Ich denke nicht, dass dies beabsichtigtes oder gewünschtes Verhalten ist, vielleicht ist es ein Fehler mit Python?
Granitosaurus

3
Dasselbe gilt für die Verwendung touchüber die Befehlszeile unter Linux, daher gehe ich davon aus, dass es sich um ein beabsichtigtes Verhalten handelt.
David Parks

11

Meine Antwort:

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')

9
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in write mode
r+  open for reading and writing. Does not create file.
a+  create file if it doesn't exist and open it in append mode
'''

Beispiel:

file_name = 'my_file.txt'
f = open(file_name, 'w+')  # open file in write mode
f.write('python rules')
f.close()

Ich hoffe das hilft. [FYI ich benutze Python Version 3.6.2]


6

open('myfile.dat', 'a') funktioniert für mich, ganz gut.

In py3k wird Ihr Code erhöht ValueError:

>>> open('myfile.dat', 'rw')
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    open('myfile.dat', 'rw')
ValueError: must have exactly one of read/write/append mode

in Python-2.6 wird es ausgelöst IOError.


6

Verwenden:

import os

f_loc = r"C:\Users\Russell\Desktop\myfile.dat"

# Create the file if it does not exist
if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

# Open the file for appending and reading
with open(f_loc, 'a+') as f:
    #Do stuff

Hinweis: Dateien müssen geschlossen werden, nachdem Sie sie geöffnet haben. Mit dem Kontext-Manager können Sie Python dies für Sie erledigen lassen.


6

Was möchten Sie mit Datei machen? Nur darauf schreiben oder sowohl lesen als auch schreiben?

'w', 'a'ermöglicht das Schreiben und erstellt die Datei, wenn sie nicht vorhanden ist.

Wenn Sie aus einer Datei lesen müssen, muss die Datei vorhanden sein, bevor Sie sie öffnen können. Sie können seine Existenz testen, bevor Sie es öffnen, oder einen Versuch / eine Ausnahme verwenden.


5
Das Testen der Existenz vor dem Öffnen kann zu einer Rennbedingung führen. Wahrscheinlich keine große Sache in diesem Fall, aber etwas zu beachten.
Daniel Hepper

1
"Wenn Sie aus einer Datei lesen müssen, muss die Datei vorhanden sein, bevor Sie sie öffnen." Danke, dass du meine geistige Gesundheit gerettet hast.
Brian Peterson

5

Ich denke es ist r+nicht rw. Ich bin nur ein Anfänger, und das habe ich in der Dokumentation gesehen.


4

Setzen Sie w + zum Schreiben der Datei, kürzen Sie, falls vorhanden, r +, um die Datei zu lesen, erstellen Sie eine, wenn sie nicht vorhanden ist, aber nicht schreiben (und geben Sie null zurück), oder ein +, um eine neue Datei zu erstellen oder an eine vorhandene anzuhängen.


1

Sie möchten also Daten in eine Datei schreiben, aber nur, wenn diese noch nicht vorhanden sind?.

Dieses Problem lässt sich leicht lösen, indem der wenig bekannte x-Modus zum Öffnen () anstelle des üblichen w-Modus verwendet wird. Zum Beispiel:

 >>> with open('somefile', 'wt') as f:
 ...     f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
...     f.write('Hello\n')
...
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'somefile'
  >>>

Wenn sich die Datei im Binärmodus befindet, verwenden Sie den Modus xb anstelle von xt.


1

Wenn Sie es zum Lesen und Schreiben öffnen möchten, gehe ich davon aus, dass Sie es beim Öffnen nicht abschneiden möchten und die Datei direkt nach dem Öffnen lesen möchten. Das ist also die Lösung, die ich benutze:

file = open('myfile.dat', 'a+')
file.seek(0, 0)

0

Vielleicht hilft das

Importieren Sie zuerst das OS-Modul in Ihre Py-Datei

import os

Erstellen Sie dann eine Variable mit dem Namen save_file und setzen Sie sie auf die Datei, die Sie in diesem Fall als HTML- oder TXT-Datei erstellen möchten

save_file = "history.txt"

Definieren Sie dann eine Funktion, die mithilfe der Dateimethode os.path.is überprüft, ob eine Datei vorhanden ist. Andernfalls wird eine Datei erstellt

def check_into():
if os.path.isfile(save_file):
    print("history file exists..... \nusing for writting....")
else:
    print("history file not exists..... \ncreating it..... ")
    file = open(save_file, 'w')
    time.sleep(2)
    print('file created ')
    file.close()

und zuletzt die Funktion aufrufen

check_into()

-2
import os, platform
os.chdir('c:\\Users\\MS\\Desktop')

try :
    file = open("Learn Python.txt","a")
    print('this file is exist')
except:
    print('this file is not exist')
file.write('\n''Hello Ashok')

fhead = open('Learn Python.txt')

for line in fhead:

    words = line.split()
print(words)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.