Open () in Python maakt geen bestand als het niet bestaat

Wat is de beste manier om een ​​bestand te openen als gelezen / schrijven als het bestaat, of als het dat niet doet, maak het dan en open het als lees / schrijven? Van wat ik heb gelezen, file = open('myfile.dat', 'rw')zou dit moeten doen, toch?

Het werkt niet voor mij (Python 2.6.2) en ik vraag me af of het een versie is, of niet zou moeten werken zoals dat of wat.

De onderste regel is, ik heb alleen een oplossing voor het probleem nodig. Ik ben nieuwsgierig naar de andere dingen, maar alles wat ik nodig heb, is een leuke manier om het openingsdeel te doen.

De insluitende map was geschraagd door gebruiker en groep, niet anders (ik ben op een Linux-systeem … dus machtigingen 775 met andere woorden), en de exacte fout was:

Ioerror: geen bestand of map.


Antwoord 1, Autoriteit 100%

U moet openmet de w+MODE:

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

Antwoord 2, Autoriteit 18%

Het voordeel van de volgende aanpak is dat het bestand correct gesloten is aan het einde van het blok, zelfs als een uitzondering onderweg wordt opgeworpen. Het is equivalent aan try-finally, maar veel korter.

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

A + Opent een bestand voor zowel toepassen als lezen. De bestandsaanwijzer is
Aan het einde van het bestand als het bestand bestaat. Het bestand wordt geopend in de
APPEND-modus. Als het bestand niet bestaat, maakt het een nieuw bestand voor
lezen en schrijven. – Python-bestandsmodi

seek()-methodestelt de huidige positie van het bestand in.

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

Alleen “rwab+”-tekens zijn toegestaan; er moet precies één van “rwa” zijn – zie Stack Overflow-vraag Detail van Python-bestandsmodi.


Antwoord 3, autoriteit 4%

Een goede gewoonte is om het volgende te gebruiken:

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')

Antwoord 4, autoriteit 3%

Verander “rw” in “w+”

Of gebruik ‘a+’ om toe te voegen (bestaande inhoud niet te wissen)


Antwoord 5, autoriteit 3%

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

r+ betekent lezen/schrijven


Antwoord 6, autoriteit 2%

Sinds python 3.4 moetpathlibworden gebruikt om bestanden te “aanraken”.
Het is een veel elegantere oplossing dan de voorgestelde oplossingen in deze thread.

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)

Hetzelfde met mappen:

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

Antwoord 7, Autoriteit 2%

'''
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
'''

Voorbeeld:

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

[fyi gebruik Python versie 3.6.2]


Antwoord 8

Mijn antwoord:

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

Antwoord 9

Gebruik:

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

Opmerking: bestanden moeten worden gesloten nadat u ze hebt geopend, en de met Context Manager is een leuke manier om Python te laten zorgen voor dit voor u.


Antwoord 10

open('myfile.dat', 'a')werkt voor mij, prima.

In Py3k Uw code verhoogt 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 roept het IOErrorop.


Antwoord 11

Wat wil je met het bestand doen? Alleen naar schrijven of zowel lezen als schrijven?

'w', 'a'staat schrijven toe en maakt het bestand als het niet bestaat.

Als u uit een bestand moet lezen, moet het bestand bestaan voordat u het kunt openen. Je kunt het bestaan ervan testen voordat je het opent of een try/behalve gebruiken.


Antwoord 12

Ik denk dat het r+is, niet rw. Ik ben maar een beginner, en dat is wat ik heb gezien in de documentatie.


Antwoord 13

Voor Python 3+ doe ik:

import os
os.makedirs('path/to/the/directory', exist_ok=True)
with open('path/to/the/directory/filename', 'w') as f:
    f.write(...)

Het probleem is dus dat with opengeen bestand kan maken voordat de doelmap bestaat. We moeten het maken en dan is de modus win dit geval voldoende.


Antwoord 14

Zet w+ om het bestand te schrijven, af te kappen als het bestaat, r+ om het bestand te lezen, er een te maken als het niet bestaat maar niet te schrijven (en null terug te geven) of a+ om een nieuw bestand aan te maken of toe te voegen aan een bestaand bestand .


Antwoord 15

Als je het wilt openen om te lezen en te schrijven, neem ik aan dat je het niet wilt afkappen terwijl je het opent en dat je het bestand wilt kunnen lezen direct nadat je het hebt geopend. Dus dit is de oplossing die ik gebruik:

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

Antwoord 16

Dus u wilt gegevens naar een bestand schrijven, maar alleen als het nog niet bestaat?

Dit probleem is eenvoudig op te lossen door de weinig bekende x-modus te gebruiken om () te openen in plaats van de gebruikelijke w-modus. Bijvoorbeeld:

>>> 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'
  >>>

Als het bestand binaire modus is, gebruik dan modus xb in plaats van xt.


Antwoord 17

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)

Other episodes