파이썬에서 open () 파일이 존재하지 않으면 파일을 만들지 않습니다


660

파일이있는 경우 읽기 / 쓰기로 파일을 열거 나없는 경우 파일을 만들어서 읽기 / 쓰기로 여는 가장 좋은 방법은 무엇입니까? 내가 읽은 것에서 이것을 file = open('myfile.dat', 'rw')해야합니까?

그것은 나를 위해 작동하지 않으며 (Python 2.6.2) 버전 문제인지, 아니면 그렇게 작동하지 않아야하는지 궁금합니다.

결론은 문제에 대한 해결책이 필요하다는 것입니다. 나는 다른 것들에 대해 궁금하지만, 필요한 것은 오프닝 부분을 수행하는 좋은 방법입니다.

둘러싸는 디렉토리는 다른 사람이 아닌 사용자와 그룹이 쓸 수 있었으며 (나는 Linux 시스템에 있습니다 ... 다른 말로 권한 775입니다) 정확한 오류는 다음과 같습니다.

IOError : 해당 파일이나 디렉토리가 없습니다.


2
S.Mark가 언급했듯이 이것은 "정상 작동"해야합니다. 둘러싸는 디렉토리를 쓸 수 있습니까?
Rakis

10
"그것은 나를 위해 작동하지 않습니다"? 구체적으로 무엇을 의미합니까? 실제 오류 메시지를 제공하십시오.
S.Lott

5
아래의 muksie의 대답은 효과가 있었지만 (완전히 baloo도 그 문제에 해당합니다), 완전성을 위해, 둘러싸는 dir은 사용자와 그룹이 쓸 수 없었으며 (Linux 시스템에서는 im. 그렇기 때문에 권한은 775입니다.) error is IOError : 해당 파일 또는 디렉토리가 없습니다. 도와 주셔서 감사합니다.
trh178

@ S.Lott : 완료 미안합니다.
trh178

존재 하는 모든 주요 폴더file존재 하는지 확인하십시오 .
Jason Goal

답변:


804

open다음 w+모드 와 함께 사용해야 합니다.

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

109
w기존 파일을 자릅니다. docs : Modes 'r+'를 클릭 'w+'하고 'a+'업데이트 할 파일을 엽니 다 (파일을 'w+'자릅니다).
SilentGhost

4
이 트릭을했다. 감사합니다. 나는 사양을 읽지 않은 것에 대한 바보 같은 느낌이 든다. 나는 'rw'조차도 받아 들일 수 없다고 생각합니다. 나는 다른 것을 생각하고 있었을 것이다.
trh178

72
a +는 파일이 존재하지 않으면 파일을 만들고 결정적으로 파일을 끝까지 찾습니다. 따라서이 방법을 연 직후에 읽으면 아무것도 얻지 못할 것입니다. f.seek (0)
Nick Zalutskiy


120
이것은 해결책이 아닙니다. 문제는 디렉토리입니다 . 스크립트에 해당 디렉토리에 파일을 작성할 수있는 권한이 없거나 디렉토리가 존재하지 않습니다. open('myfile.dat', 'w')그러면 충분합니다.
Daniel F

137

다음 접근 방식의 장점은 도중에 예외가 발생하더라도 파일이 블록의 끝에 올바르게 닫히는 것입니다. 와 동일 try-finally하지만 훨씬 짧습니다.

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

a + 추가 및 읽기 용 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 추가 모드에서 파일이 열립니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성합니다. - 파이썬 파일 모드

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
open (filename, 'a +')을 myfile로 사용하여 시도하고 IOError : [Errno 2] 해당 파일이나 디렉토리가 없습니다.-파일을 작성하지 않는 이유는 무엇입니까?
Loretta

@Loretta 값을 확인 했습니까 filename?
Qwerty

그래, 내가 했어. 유니 코드 문자열입니다. 또한 open ( '{}. txt'.format (filename),'a + ')을 myfile로 사용해 보았습니다.
Loretta

경로를 사용하지 않습니다. 그리고 open ( 'test.txt', 'a +') 시도하면 os.stat (myfile) .st_size == 0 인 경우 'TypeError : Unicode로 강제 변환 : 문자열 또는 버퍼 필요, 파일을 찾았습니다'라는 예외가 발생합니다.
Loretta

이를 위해서는 인코딩을 올바르게 정의해야합니다. stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

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 +"모드는 파일을 여는 가장 좋은 방법입니다. 새 파일을 만들고 기존 파일에 추가합니다. 이것을 시도 / 제외에 포장하는 것을 잊지 마십시오.
sleblanc

컴퓨팅 모드 쓰기 또는 추가는 관심이 없습니다. 파일이 없으면 추가 모드에서 파일을 만듭니다.
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 +는 읽기 / 쓰기를 의미합니다



38
더 나쁜 것은,이 코드는 경쟁 조건이되기 쉽다는 것입니다. 따라서 파일이 있는지 확인한 후 프로세스가 중단되고 다른 프로세스가이 파일을 작성할 수 있습니다.
antibus

"w +"플래그도 필요하므로 두 파일 모두 읽기 및 쓰기 모드가됩니다.
매트

14

파이썬 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사용시 마지막 수정 시간을 업데이트합니다.
David Parks

@DavidParks 좋은 지적, 방금 테스트했으며 실제로 ext4 파일 시스템 및 python3.7.2에서 사실입니다. 나는 그것이 의도되거나 의도 된 행동이라고 생각하지 않습니다. 아마도 파이썬의 버그일까요?
Granitosaurus

3
touch리눅스의 커맨드 라인에서 사용할 때도 마찬가지이므로 의도 된 동작이라고 가정합니다.
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()

이게 도움이 되길 바란다. [참고로 파이썬 버전 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

참고 : 파일을 연 후에는 파일을 닫아야하며 with context manager를 사용하면 Python에서이를 처리 할 수 ​​있습니다.


6

파일로 무엇을 하시겠습니까? 그것에 쓰기 또는 읽기와 쓰기 모두?

'w', 'a'파일 쓰기가 가능하고 파일이없는 경우 파일을 만듭니다.

파일에서 읽어야하는 경우 파일을 열기 전에 파일이 존재해야합니다. 열기 전에 시도하거나 제외 / 사용을 사용하여 존재 여부를 테스트 할 수 있습니다.


5
개봉 전에 존재 여부를 테스트하면 경쟁 조건이 발생할 수 있습니다. 아마도이 경우에는별로 중요하지 않지만 명심해야 할 것이 있습니다.
Daniel Hepper

1
"파일에서 읽어야하는 경우 파일을 열기 전에 파일이 존재해야합니다." 내 정신을 구해줘 서 고마워
Brian Peterson

5

나는 r+그렇지 않다고 생각한다 rw. 나는 단지 초보자 일 뿐이며, 이것이 문서에서 본 것입니다.


4

파일을 쓰기 위해 w +, 파일이 있으면 잘림, r +를 사용하여 파일을 읽습니다.


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 대신 mode 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.