open () di Python tidak membuat file jika tidak ada


662

Apa cara terbaik untuk membuka file sebagai baca / tulis jika ada, atau jika tidak, lalu buat dan buka sebagai baca / tulis? Dari apa yang saya baca, file = open('myfile.dat', 'rw')harus melakukan ini, kan?

Ini tidak berfungsi untuk saya (Python 2.6.2) dan saya bertanya-tanya apakah ini masalah versi, atau tidak seharusnya bekerja seperti itu atau apa.

Intinya adalah, saya hanya perlu solusi untuk masalah ini. Saya ingin tahu tentang hal-hal lain, tetapi yang saya butuhkan adalah cara yang baik untuk melakukan bagian pembuka.

Direktori terlampir dapat ditulisi oleh pengguna dan grup, bukan yang lain (saya menggunakan sistem Linux ... jadi izin 775 dengan kata lain), dan kesalahan sebenarnya adalah:

IOError: tidak ada file atau direktori tersebut.


2
Seperti S.Mark disebutkan, ini harus "hanya berfungsi". Apakah direktori terlampir dapat ditulisi?
Rakis

10
"Itu tidak bekerja untukku"? Apa artinya itu, khususnya? Harap berikan pesan kesalahan yang sebenarnya.
S.Lott

5
jawaban muksie di bawah ini bekerja (dan juga Baloo), tetapi hanya untuk kelengkapan, direktori terlampir dapat ditulis oleh pengguna dan grup, bukan yang lain (im pada sistem linux ... jadi izin 775 dengan kata lain), dan tepat kesalahan adalah IOError: tidak ada file atau direktori tersebut. terima kasih atas bantuan kalian.
trh178

@ S.Lott: selesai. maaf soal itu.
trh178

pastikan semua folder utama yang fileada.
Jason Goal

Jawaban:


804

Anda harus menggunakan opendengan w+mode:

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

110
wmemotong file yang ada. docs: Mode 'r+', 'w+'dan 'a+'buka file untuk memperbarui (catatan yang 'w+'memotong file).
SilentGhost

4
ini berhasil. Terima kasih. saya merasa seperti orang bodoh sekarang karena tidak membaca spec. Saya tidak berpikir 'rw' bahkan dapat diterima di sana. Aku pasti memikirkan sesuatu yang lain.
trh178

72
Perhatikan bahwa + membuat file jika tidak ada dan, yang terpenting, mencari file sampai akhir. Jadi jika Anda membaca segera setelah membuka dengan cara ini, Anda tidak akan mendapatkan apa-apa. Anda perlu mencari kembali ke awal terlebih dahulu: f.seek (0)
Nick Zalutskiy


121
Ini bukan solusinya. The masalah adalah direktori . Entah skrip tidak memiliki izin untuk membuat file di direktori itu, atau direktori itu tidak ada. open('myfile.dat', 'w')sudah cukup.
Daniel F

137

Keuntungan dari pendekatan berikut adalah bahwa file ditutup dengan benar di ujung blok, bahkan jika ada pengecualian yang muncul. Ini setara dengan try-finally, tetapi jauh lebih pendek.

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

a + Membuka file untuk ditambahkan dan dibaca. Penunjuk file ada di akhir file jika file ada. File terbuka dalam mode tambahkan. Jika file tidak ada, itu membuat file baru untuk membaca dan menulis. - Mode file Python

metode seek () mengatur posisi file saat ini.

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

Hanya karakter "rwab +" yang diizinkan; pasti ada salah satu dari "rwa" - lihat detail Stack Overflow pertanyaan mode file Python .


1
Saya mencoba ini dengan membuka (nama file, 'a +') sebagai myfile: dan mendapatkan IOError: [Errno 2] Tidak ada file atau direktori: - mengapa tidak membuat file?
Loretta

@ Loretta Sudahkah Anda memeriksa nilai filename?
Qwerty

Ya saya lakukan. Ini adalah string unicode. Saya juga mencoba dengan open ('{}. Txt'.format (filename),' a + ') sebagai myfile:
Loretta

Saya tidak menggunakan jalur. dan saya mencoba membuka ('test.txt', 'a +') mendapat pengecualian berikut 'TypeError: memaksa ke Unicode: perlu string atau buffer, file ditemukan' di baris jika os.stat (myfile) .st_size == 0:
Loretta

Anda perlu mendefinisikan pengodean agar bisa berfungsi. stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

31

Praktik yang baik adalah menggunakan yang berikut ini:

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
Adalah buruk untuk menguji file sebelum membukanya, karena dapat menyebabkan kondisi ras (file dihapus sebelum dibuka). Kondisi ras terkadang dapat digunakan untuk mengeksploitasi kerentanan dalam suatu sistem. Mode "a +" adalah cara terbaik untuk membuka file: itu membuat file baru, dan menambahkan ke file yang ada. Jangan lupa untuk membungkus ini dalam coba / kecuali.
sleblanc

mode komputasi tulis atau tambahkan tidak memiliki minat. Jika file tidak ada, mode tambahkan membuatnya.
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 + berarti membaca / menulis



38
lebih buruk lagi, kode ini rentan terhadap kondisi balapan. dengan demikian, setelah memeriksa apakah file tersebut ada, prosesnya dapat terganggu dan proses lain dapat membuat file ini.
antibus

Anda juga memerlukan tanda "w +" sehingga kedua file akan berada dalam mode baca dan tulis.
The Matt

14

Karena python 3.4 Anda harus menggunakan pathlibuntuk "menyentuh" ​​file.
Ini adalah solusi yang jauh lebih elegan daripada yang diusulkan di utas ini.

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)

Hal yang sama dengan direktori:

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

2
touchtidak memperbarui waktu modifikasi terakhir saat digunakan.
David Parks

@DavidParks poin bagus, baru mengujinya dan memang benar pada sistem file ext4 dan python3.7.2. Saya tidak berpikir itu perilaku yang diinginkan atau diinginkan, mungkin itu adalah bug dengan python?
Granitosaurus

3
Hal yang sama ketika menggunakan touchdi baris perintah di linux, jadi saya menganggap itu perilaku yang dimaksudkan.
David Parks

11

Jawabanku:

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

contoh:

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

Saya harap ini membantu. [FYI saya menggunakan python versi 3.6.2]


6

open('myfile.dat', 'a') bekerja untuk saya, baiklah.

di py3k kode Anda memunculkan 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

di python-2.6 itu memunculkan IOError.


6

Menggunakan:

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

Catatan: File harus ditutup setelah Anda membukanya, dan manajer konteks with adalah cara yang bagus untuk membiarkan Python mengurus ini untuk Anda.


6

Apa yang ingin Anda lakukan dengan file? Hanya menulis untuk itu atau keduanya membaca dan menulis?

'w', 'a'akan memungkinkan menulis dan akan membuat file jika tidak ada.

Jika Anda perlu membaca dari suatu file, file tersebut harus ada sebelum membukanya. Anda dapat menguji keberadaannya sebelum membukanya atau menggunakan coba / kecuali.


5
Menguji keberadaan sebelum pembukaan mungkin memperkenalkan kondisi balapan. Mungkin bukan masalah besar dalam kasus ini, tetapi sesuatu yang perlu diingat.
Daniel Hepper

1
"Jika Anda perlu membaca dari suatu file, file tersebut harus ada sebelum Anda membukanya." Terima kasih telah menyelamatkan kewarasan saya.
Brian Peterson

5

Saya pikir r+tidak rw. Saya hanya pemula, dan itulah yang saya lihat di dokumentasi.


4

Masukkan w + untuk menulis file, potong jika ada, r + untuk membaca file, buat satu jika tidak ada tetapi tidak menulis (dan mengembalikan nol) atau + untuk membuat file baru atau menambahkan ke yang sudah ada.


1

Jadi, Anda ingin menulis data ke file, tetapi hanya jika belum ada?

Masalah ini mudah diselesaikan dengan menggunakan mode x yang tidak diketahui untuk membuka () alih-alih mode w biasa. Sebagai contoh:

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

Jika file tersebut adalah mode biner, gunakan mode xb alih-alih xt.


1

Jika Anda ingin membukanya untuk membaca dan menulis, saya berasumsi Anda tidak ingin memotongnya saat Anda membukanya dan Anda ingin dapat membaca file setelah membukanya. Jadi ini solusi yang saya gunakan:

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

0

Mungkin ini akan membantu

impor modul os terlebih dahulu ke file py Anda

import os

kemudian buat variabel bernama save_file dan atur ke file yang ingin Anda buat html atau txt dalam hal ini file txt

save_file = "history.txt"

kemudian tentukan fungsi yang akan menggunakan metode file os.path.is untuk memeriksa apakah file itu ada dan jika tidak, ia akan membuat file

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

dan akhirnya panggil fungsinya

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.