open () у Python не створює файл, якщо його не існує


660

Який найкращий спосіб відкрити файл як читання / запис, якщо він існує, або якщо його немає, то створити його та відкрити як читання / запис? З того, що я прочитав, це file = open('myfile.dat', 'rw')слід робити, правда?

Він не працює для мене (Python 2.6.2), і мені цікаво, чи це проблема з версією, чи не повинна працювати так чи як.

Суть полягає в тому, що мені просто потрібно вирішити проблему. Мені цікаво про інші речі, але все, що мені потрібно, це приємний спосіб зробити вступну частину.

Каталог, що додається, можна писати користувачем і групою, а не іншим (я в системі Linux ... так що дозволи 775 іншими словами), і точна помилка була:

IOError: такого файлу чи каталогу немає.


2
Як зазначив С.Марк, це повинно "просто працювати". Чи можна писати каталог, що додається?
Ракіс

10
"це не працює для мене"? Що це конкретно означає? Надайте фактичне повідомлення про помилку.
S.Lott

5
Відповідь muksie нижче працювала (і baloo теж для цього питання), але просто для повноти, що додається редактор було написано користувачем і групою, а не іншими (я в системі Linux ... так що дозволи 775 іншими словами), і точне помилка була IOError: немає такого файлу чи каталогу. дякую за допомогу хлопці
trh178

@ S.Lott: зроблено. Вибач за те.
trh178

переконайтеся , що всі провідні папки з fileіснує.
Гол Джейсона

Відповіді:


804

Вам слід користуватися openв w+режимі:

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

109
wобрізає існуючий файл. документи: Режими 'r+', 'w+'і 'a+'відкрити файл для оновлення (зауважимо , що 'w+'обрізає файл).
SilentGhost

4
це зробило трюк. Дякую тобі. Зараз я відчуваю себе ідіоткою, бо не читав специфікації. я не думаю, що "rw" є навіть прийнятним там. я, мабуть, думав про щось інше.
trh178

72
Зауважте, що + створює файл, якщо його не існує, і, головне, шукає файл до кінця. Тож якщо ви прочитаєте відразу після відкриття цього шляху, ви нічого не отримаєте. Спершу вам потрібно повернутися до початку: f.seek (0)
Нік Залуцький


120
Це не рішення. Проблема є каталогом . Або скрипту не вистачає дозволів на створення файлу в цьому каталозі, або каталог просто не існує. open('myfile.dat', 'w')тоді достатньо.
Даніель Ф

137

Перевага наступного підходу полягає в тому, що файл належним чином закритий в кінці блоку, навіть якщо в дорозі створюється виняток. Це рівнозначно try-finally, але набагато коротше.

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

a + Відкриває файл для додавання та читання. Указівник на файл знаходиться в кінці файлу, якщо файл існує. Файл відкривається в режимі додавання. Якщо файл не існує, він створює новий файл для читання та запису. - Режими файлів Python

Метод search () встановлює поточне положення файлу.

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" - див . детальну інформацію про режими файлів Python щодо запитання про переповнення стека .


1
Я намагаюся це зробити з відкритим (ім'я файлу, "a +") як мій файл: і отримати IOError: [Errno 2] Немає такого файлу чи каталогу: - чому він не створює файл?
Лоретта

@Loretta Ви перевірили значення filename?
Qwerty

Так. Це рядок Unicode. Я також спробував з файлом open ('{}. Txt'.format (назва файлу),' a + ') як мій файл:
Loretta

Я не використовую шлях. і я спробував відкрити ('test.txt', 'a +'), він отримує наступний виняток 'TypeError: примушування до Unicode: потрібен рядок або буфер, файл знайдено' у рядку, якщо os.stat (myfile) .st_size == 0:
Лоретта

Для цього потрібно правильно визначити кодування. stackoverflow.com/q/728891/3701431
Сергій Колодяжний

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
Неправильно тестувати файл перед його відкриттям, оскільки це може призвести до перегонів (файл видаляється до його відкриття). Умови перегонів іноді можуть бути використані для використання вразливості в системі. Режим "а +" - найкращий спосіб відкрити файл: він створює новий файл та додає до існуючих файлів. Не забудьте загорнути це в спробу / крім.
sleblanc

режим обчислення запису або додавання не представляє інтересу. Якщо файлу не існує, режим додавання створює його.
Жан-Франсуа Фабре


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

r + означає читання / запис



38
ще гірше, що цей код схильний до перегонів. таким чином, перевіривши, чи файл існує, процес може бути перерваний і інший процес може створити цей файл.
антибус

Вам також знадобиться прапор "w +", тому обидва файли будуть у режимах читання та запису.
Метт

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. Я не думаю, що це призначена чи бажана поведінка, можливо, це помилка з пітоном?
Granitosaurus

3
Те саме, що використовується touchв командному рядку в Linux, тому я припускаю, що це призначена поведінка.
Девід Паркс

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

Я сподіваюся, що це допомагає. [FYI використовую 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'дозволить записати і створить файл, якщо його не існує.

Якщо вам потрібно прочитати з файлу, він повинен існувати перед відкриттям. Ви можете перевірити його існування перед відкриттям або використовувати спробу / виняток.


5
Тестування на існування перед відкриттям може ввести умови перегонів. Напевно, це не велика справа в цьому випадку, але щось потрібно пам’ятати.
Даніель Хеппер

1
"Якщо вам потрібно прочитати з файлу, він повинен існувати, перш ніж відкривати його." Дякую, що врятували мій розум.
Брайан Петерсон

5

Я думаю, що це r+не так rw. Я просто починаючий, і це я бачив у документації.


4

Покладіть w + для запису файла, обрізання, якщо він існує, r + для читання файлу, створення одного, якщо він не існує, але не написання (і повернення нуля) або + для створення нового файлу або додавання до вже існуючого.


1

Отже, Ви хочете записати дані у файл, але тільки якщо вони вже не існують ?.

Цю проблему легко вирішити, використовуючи маловідомий режим x для відкриття () замість звичайного режиму w. Наприклад:

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

Якщо файл є двійковим режимом, використовуйте режим xb замість xt.


1

Якщо ви хочете відкрити його для читання та запису, я припускаю, що ви не хочете усікати його під час відкриття, а ви зможете прочитати файл відразу після відкриття. Тож це рішення, яке я використовую:

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

0

можливо, це допоможе

перший імпорт ОС модуля у ваш файл 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.