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


662

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

私(Python 2.6.2)では機能していません。バージョンの問題なのか、それともそのように機能するのではないのかと思っています。

要するに、問題の解決策が必要なのです。他のことについては気になりますが、必要なのは、冒頭の部分を行うための良い方法です。

囲んでいるディレクトリは、他のユーザーやグループではなく、ユーザーやグループによって書き込み可能でした(私はLinuxシステムを使用しています...つまり、権限775です)。正確なエラーは次のとおりです。

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


2
S.Markが述べたように、これは「うまくいく」はずです。包含ディレクトリは書き込み可能ですか?
Rakis

10
「うまくいかない」?具体的にはどういう意味ですか?実際のエラーメッセージを入力してください。
S.Lott

5
以下のmuksieの答えはうまくいきました(そしてその点ではbalooも同じです)が、完全を期すために、囲んでいるディレクトリはユーザーとグループによって書き込み可能であり、他のものではありませんでした(Linuxシステムではim ...つまりパーミッション775)、そして正確エラーはIOErrorでした:そのようなファイルまたはディレクトリはありません。助けてくれてありがとう。
trh178

@ S.Lott:完了しました。申し訳ありません。
trh178

の主要なフォルダがすべてfile存在することを確認してください
ジェイソンゴール

回答:


804

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

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

110
w既存のファイルを切り捨てます。docs:モード'r+''w+'そして'a+'更新のためにファイルを開きます(ファイルは'w+'切り捨てられることに注意してください)。
SilentGhost

4
これでうまくいきました。ありがとうございました。仕様を読んでいないので、今はばかみたいです。「rw」も受け入れられるとは思いません。他のことを考えていたに違いない。
trh178

72
a +は、ファイルが存在しない場合にファイルを作成し、決定的にファイルを最後までシークすることに注意してください。したがって、この方法で開いた直後に読み取りを行うと、何も得られません。最初に最初に戻る必要があります:f.seek(0)
Nick Zalutskiy


121
これは解決策ではありません。問題は、ディレクトリです。スクリプトにそのディレクトリにファイルを作成する権限がないか、ディレクトリが存在しません。open('myfile.dat', 'w')その後は十分です。
ダニエルF

137

次の方法の利点は、途中で例外が発生した場合でも、ファイルがブロックの最後で適切に閉じられることです。と同等ですが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の質問Pythonファイルモードの詳細を参照してください。


1
私はこれをmyfile:としてopen(filename、 'a +')で試して、IOErrorを取得します。
ロレッタ2015

@ロレッタの値を確認しましたfilenameか?
Qwerty、2015

はい、そうしました。これはUnicode文字列です。私もopen( '{}。txt'.format(filename)、' a + ')をmyfileとして試しました:
Loretta

パスを使用していません。そして、私はopen( 'test.txt'、 'a +')を試みましたが、次の例外 'TypeError:coercing to Unicode:need string or buffer、file found' if the line if os.stat(myfile).st_size == 0:
ロレッタ2015

これを機能させるには、エンコーディングを適切に定義する必要があります。stackoverflow.com/q/728891/3701431
セルギーコロディアズニー16

31

以下を使用することをお勧めします。

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
競合状態を引き起こす可能性があるため、ファイルを開く前にテストすることはお勧めできません(ファイルが開かれる前に削除されます)。競合状態は、システムの脆弱性を悪用するために使用されることがあります。「a +」モードは、ファイルを開くための最良の方法です。新しいファイルを作成し、既存のファイルに追加します。これをtry / exceptでラップすることを忘れないでください。
sleblanc 2017

コンピューティングモードの書き込みまたは追加は関係ありません。ファイルが存在しない場合は、追加モードで作成されます。
ジャン=フランソワ・ファーブル


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

r +は読み取り/書き込みを意味します



38
さらに悪いことに、このコードは競合状態になる傾向があります。したがって、ファイルが存在するかどうかを確認した後、プロセスが中断され、別のプロセスがこのファイルを作成する可能性があります。
アンチバス2014

また、両方のファイルが読み取りモードと書き込みモードになるように、「w +」フラグも必要です。
The Matt

14

Python 3.4以降では、ファイルの「タッチ」に使用する必要があり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)

2
touch使用時に最終変更時刻を更新します。
デビッドパークス

@DavidParksの良い点は、テストしたばかりで、ext4ファイルシステムとpython3.7.2で実際に当てはまります。私はそれが意図されたまたは望ましい動作ではないと思います、多分それはpythonのバグですか?
グラニトサウルス

3
touchLinuxのコマンドラインで使用する場合も同じなので、意図した動作であると思います。
David Parks

11

私の答え:

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

例:

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を使用しています]


6

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ます。


6

使用する:

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

注:ファイルは、あなたがそれらを開いた後にクローズする必要がある、としてコンテキストマネージャは、あなたのためにこれのPythonの世話をさせるの素晴らしい方法です。


6

ファイルをどのように処理しますか?書き込みのみか、読み取りと書き込みの両方ですか?

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

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


5
開く前に存在をテストすると、競合状態が発生する可能性があります。この場合は大した問題ではないかもしれませんが、覚えておかなければなりません。
Daniel Hepper

1
「ファイルから読み取る必要がある場合は、開く前にファイルが存在している必要があります。」私の正気を救ってくれてありがとう。
ブライアンピーターソン

5

私はそれがだと思うr+、ではありませんrw。私はスターターであり、それは私がドキュメントで見たものです。


4

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


1

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

この問題は、通常の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を使用します。


1

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

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

0

これが役立つかもしれません

最初にosモジュールをpyファイルにインポートします

import os

次に、save_fileという名前の変数を作成し、htmlまたはtxt(この場合はtxtファイル)にするファイルに設定します

save_file = "history.txt"

次に、os.path.isファイルメソッドを使用してファイルが存在するかどうかを確認し、存在しない場合はファイルを作成する関数を定義します。

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

そして最後に関数を呼び出します

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.