web-dev-qa-db-ja.com

pythonのopen()は、ファイルが存在しない場合はファイルを作成しません。

ファイルが存在する場合は読み書き可能として開く、そうでない場合は作成して読み書き可能として開くための最良の方法は何ですか?私が読んだものから、file = open('myfile.dat', 'rw')はこれをするべきですね。

私にはうまくいきません(Python 2.6.2)。それがバージョンの問題なのか、それともそのようなものになるべきではないのでしょうか。

肝心なのは、私はただ問題の解決策が必要だということです。私は他のものに興味があります、しかし私が必要とするすべては冒頭部分をする素晴らしい方法です。

更新:囲んでいるディレクトリは他のユーザではなくユーザとグループによって書き込み可能であり(私はLinuxシステム上にいます...つまりパーミッション775)、そして正確なエラーは以下のとおりです。

IOError:そのようなファイルやディレクトリはありません。

551
trh178

openw+モードで使用する必要があります。

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

次のアプローチの利点は、たとえ途中で例外が発生したとしても、ファイルはブロックの最後で 正しく閉じられた であることです。 try-finallyと同等ですが、はるかに短くなります。

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

a + 追加と読み取りの両方の目的でファイルを開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。ファイルが追加モードで開きます。ファイルが存在しない場合は、読み書き用の新しいファイルが作成されます。 - Pythonファイルモード

seek()メソッド ファイルの現在位置を設定します。

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

"rwab +"文字のみが許可されています。 "rwa"の1つだけがなければなりません - Stack Overflow question Pythonファイルモードの詳細を参照してください。

112
Qwerty

次のようにしてください。

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')
32
lollercoaster
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

r +は読み書きを意味します

31
Khorkrak

"rw"を "w +"に変更

または追加するには 'a +'を使用します(既存のコンテンツを消去しない)。

26
baloo

私の答え:

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

Python 3.4以降、あなたはshould _ファイルを "タッチ"するためにpathlibを使います。
これは、このスレッドで提案されているものよりもはるかにエレガントな解決策です。

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)

ディレクトリについても同じです。

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

open('myfile.dat', 'a')は私のために働きます、大丈夫です。

py3kではあなたのコードは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ではIOErrorが発生します。

7
SilentGhost

r + ではなく r + だと思います。私はただの初心者です、そしてそれは私がドキュメンテーションで見たものです。

6
Angel Poppy

あなたはファイルで何をしたいですか?それへの書き込みだけ、あるいは読み書き両方?

'w'、 'a'は書き込みを許可し、存在しない場合はファイルを作成します。

ファイルから読み込む必要がある場合は、ファイルを開く前に存在している必要があります。開く前にその存在をテストするか、try/exceptを使うことができます。

6
user49117

ファイルを書き込む場合はw +、存在する場合は切り捨て、ファイルを読み取る場合はr +、存在しないが書き込みを行わない場合は作成(nullを返す)、または新しいファイルを作成するか既存のファイルに追加する場合は+を設定します。

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

例:

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

これが役に立つことを願っています。 [私はpythonバージョン3.6.2を使っています]

5
Gajendra D Ambi

あなたがそれを読み書きするために開きたいなら、私はあなたがそれを開くときあなたがそれを切り捨てたくない、そしてあなたがそれを開いた直後にあなたがファイルを読むことができるようにしたいと思います。だからこれは私が使っている解決策です:

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

つかいます:

import os

f_loc = r"C:\Users\Russell\Desktop\ip_addr.txt"

if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

with open(f_loc) as f:
    #Do stuff

ファイルを開いた後は必ずファイルを閉じてください。 withコンテキストマネージャがこれを行います。

4
Mr. Me
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)
1
Ganesh Jat

ファイルにデータを書き込みたいのですが、それがまだ存在しない場合に限ります。

この問題は、通常のwモードの代わりに、あまり知られていないxモードをopen()に使用することで簡単に解決できます。例えば:

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

ファイルがバイナリモードの場合は、xtの代わりにモードxbを使用します。

0
njoshsn