open () in Python yoksa bir dosya oluşturmaz


661

Bir dosyayı varsa okuma / yazma olarak açmanın veya yoksa açmanın en iyi yolu nedir, sonra onu oluşturun ve okuma / yazma olarak açın? Okuduğum kadarıyla file = open('myfile.dat', 'rw')bunu yapmalı, değil mi?

Benim için çalışmıyor (Python 2.6.2) ve bunun bir sürüm problemi olup olmadığını merak ediyorum, ya da böyle ya da ne işe yaramıyor.

Sonuç olarak, sadece sorun için bir çözüme ihtiyacım var. Diğer şeyleri merak ediyorum, ama ihtiyacım olan tek şey açılış bölümünü yapmak için güzel bir yol.

Çevreleyen dizin kullanıcı ve grup tarafından yazılabilirdi, diğer değil (Linux sistemindeyim ... yani 775 izinleri) ve tam hata:

IOError: böyle bir dosya veya dizin yok.


2
S.Mark'ın belirttiği gibi, bu "sadece işe yaramalıdır". Ekteki dizin yazılabilir mi?
Rakis

10
"benim için çalışmıyor" mu? Bu özellikle ne anlama geliyor? Lütfen gerçek hata mesajını verin.
S.Lott

5
muksie'nin aşağıdaki cevabı işe yaradı (ve baloo da bu konu için), ancak sadece eksiksizlik için, çevreleyen dir kullanıcı ve grup tarafından yazılabilirdi, diğer değil (linux sistemindeyim ... yani 775 izinleri) ve tam olarak hatası IOError: böyle bir dosya veya dizin yok. Yardımlarınız için teşekkürler çocuklar.
trh178

@ S.Lott: bitti. bunun için üzgünüm.
trh178

Emin tüm önde gelen hale klasörleri arasında filebulunmaktadır.
Jason Goal

Yanıtlar:


804

Modu openile kullanmalısınız w+:

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

109
wvarolan dosyayı keser. docs: Modlar 'r+', 'w+'ve 'a+'güncelleme için dosyayı açmak (not bu 'w+'kesikler dosyası).
SilentGhost

4
bu hile yaptı. teşekkür ederim. Şimdi özellikleri okumadığım için aptal gibi hissediyorum. 'rw' orada bile kabul edilebilir sanmıyorum. başka bir şey düşünüyor olmalıydım.
trh178

72
A + 'nın mevcut değilse bir dosya oluşturduğunu ve en önemlisi dosyayı sonuna kadar aradığını unutmayın. Bu şekilde açtıktan hemen sonra bir okuma yaparsanız, hiçbir şey elde edemezsiniz. İlk önce başa dönmeniz gerekiyor: f.seek (0)
Nick Zalutskiy


120
Bu çözüm değil. Sorun dizinidir . Komut dosyasında, bu dizinde dosya oluşturma izinleri yok veya dizin yok. open('myfile.dat', 'w')o zaman yeterlidir.
Daniel F

137

Aşağıdaki yaklaşımın avantajı , yolda bir istisna olsa bile dosyanın blok sonunda düzgün şekilde kapatılmasıdır . Eşdeğer try-finally, ama çok daha kısa.

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

a + Hem ekleme hem de okuma için bir dosya açar. Dosya varsa dosya işaretçisi dosyanın sonundadır. Dosya ekleme modunda açılır. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur. - Python dosya modları

seek () yöntemi dosyanın geçerli konumunu ayarlar.

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

Yalnızca "rwab +" karakterlerine izin verilir; tam olarak "rwa" olmalıdır - bkz. Yığın Taşması sorusu Python dosya modları ayrıntısı .


1
Bunu dosyam olarak open (dosya adı, 'a +') ile deniyorum ve IOError: [Errno 2] Böyle bir dosya veya dizin yok: - neden dosyayı oluşturmuyor?
Loretta

@Loretta değerini kontrol ettiniz mi filename?
Qwerty

Evet yaptım. Unicode bir dizedir. Ayrıca dosyam olarak open ('{}. Txt'.format (dosyaadı),' a + ') ile denedim:
Loretta

Bir yol kullanmıyorum. ve o'stat (myfile) .st_size == 0 satırında açık ('test.txt', 'a +') denedim 'TypeError: Unicode için zorlama: dizgiye veya arabelleğe, dosya bulundu' istisnasına göre aşağıdaki istisna alır.
Loretta

Bunun çalışması için kodlamayı düzgün bir şekilde tanımlamanız gerekir. stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

31

İyi uygulama aşağıdakileri kullanmaktır:

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
Bir dosyayı açmadan önce test etmek kötüdür, çünkü yarış koşullarına yol açabilir (dosya açılmadan önce silinir). Yarış koşulları bazen bir sistemdeki güvenlik açıklarından yararlanmak için kullanılabilir. "a +" modu dosyayı açmanın en iyi yoludur: yeni bir dosya oluşturur ve mevcut dosyalara ekler. Bunu bir denemede / dışında sarmayı unutmayın.
sleblanc

bilgi işlem modu yazma veya ekleme ilgisi yoktur. Dosya yoksa, ekleme modu dosyayı oluşturur.
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 + okuma / yazma anlamına gelir



38
daha da kötüsü, bu kod bir yarış durumuna yatkındır. böylece dosyanın var olup olmadığını kontrol ettikten sonra işlem yarıda kesilebilir ve başka bir işlem bu dosyayı oluşturabilir.
antibus

Ayrıca her iki dosyanın da okuma ve yazma modunda olması için "w +" bayrağına ihtiyacınız olacaktır.
Matt

14

Piton 3.4 beri gerektiğini kullanmak pathlib"dokunmatik" dosyalarına.
Bu konuda önerilenlerden çok daha şık bir çözümdür.

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)

Dizinlerle aynı şey:

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

2
touchkullanıldığında en son değiştirilen zamanı günceller.
David Parks

@DavidParks iyi bir nokta, sadece test ve gerçekten ext4 dosya sistemi ve python3.7.2 için geçerlidir. Bunun amaçlanan veya istenen davranış olduğunu düşünmüyorum, belki python ile bir hata?
Granitosaurus

3
touchLinux komut satırında kullanırken aynı şey , bu yüzden amaçlanan davranış olduğunu varsayalım.
David Parks

11

Cevabım:

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

misal:

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

Umarım bu yardımcı olur. [FYI python sürüm 3.6.2 kullanıyorum]


6

open('myfile.dat', 'a') benim için çalışıyor, gayet iyi.

py3k'te kodunuz 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

python-2.6'da yükselir IOError.


6

kullanın:

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

Not: Dosyaları açtıktan sonra kapatılmalıdır ve içerik yöneticisi ile Python'un sizin için bununla ilgilenmesine izin vermenin güzel bir yoludur.


6

Dosya ile ne yapmak istiyorsunuz? Sadece ona mı yazıyorsunuz, yoksa hem oku hem de yaz?

'w', 'a'yazmaya izin verir ve mevcut değilse dosyayı oluşturur.

Bir dosyadan okumanız gerekiyorsa, dosyayı açmadan önce var olmalıdır. Varlığını açmadan önce test edebilir veya bir dene / hariç kullan.


5
Açmadan önce varlığını test etmek bir yarış durumu getirebilir. Muhtemelen bu durumda büyük bir anlaşma değil, akılda tutulması gereken bir şey.
Daniel Hepper

1
"Bir dosyadan okumanız gerekiyorsa, dosyayı açmadan önce var olmalıdır." Aklımı kurtardığın için teşekkürler.
Brian Peterson

5

Bence öyle r+değil rw. Ben sadece bir başlangıççıyım ve belgelerde de gördüm.


4

Dosya yazmak için w + koyun, varsa kısaltın, dosyayı okumak için r + yazın, yoksa bir dosya oluşturun, ancak yazmayın (ve null döndürmeyin) veya yeni bir dosya oluşturmak veya mevcut bir dosyaya eklemek için +.


1

Yani bir dosyaya veri yazmak istiyorsunuz, ama sadece mevcut değilse?

Bu sorun, normal w modu yerine () açmak için az bilinen x modu kullanılarak kolayca çözülür. Örneğin:

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

Dosya ikili modsa, xt yerine xb modunu kullanın.


1

Okumak ve yazmak için açmak istiyorsanız, açarken kısaltmak istemediğinizi ve dosyayı açtıktan hemen sonra okumak istediğinizi varsayıyorum. Bu benim kullandığım çözüm:

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

0

belki bu yardımcı olur

önce os modülünü py dosyanıza aktarın

import os

sonra save_file adında bir değişken oluşturun ve bu durumda html veya txt yapmak istediğiniz dosyaya ayarlayın.

save_file = "history.txt"

sonra dosyanın var olup olmadığını kontrol etmek için os.path.is dosya yöntemini kullanacak bir işlev tanımlayın ve eğer değilse bir dosya oluşturur

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

ve son olarak işlevi çağırın

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.