पायथन में खुला () मौजूद नहीं होने पर फ़ाइल नहीं बनाता है


660

फ़ाइल को पढ़ने / लिखने के लिए खोलने का सबसे अच्छा तरीका क्या है अगर यह मौजूद है, या यदि यह नहीं है, तो इसे बनाएं और इसे पढ़ने या लिखने के रूप में खोलें? मैंने जो पढ़ा है, उससे file = open('myfile.dat', 'rw')यह करना चाहिए, है ना?

यह मेरे लिए काम नहीं कर रहा है (पायथन 2.6.2) और मैं सोच रहा हूं कि क्या यह एक संस्करण की समस्या है, या उस तरह से या क्या काम नहीं करना चाहिए।

लब्बोलुआब यह है, मैं सिर्फ समस्या के लिए एक समाधान की जरूरत है। मैं अन्य सामानों के बारे में उत्सुक हूं, लेकिन मुझे जो कुछ भी चाहिए वह शुरुआती भाग को करने का एक अच्छा तरीका है।

एन्कोडिंग निर्देशिका उपयोगकर्ता और समूह द्वारा लिखी गई थी, अन्य नहीं (मैं एक लिनक्स सिस्टम पर हूं ... इसलिए दूसरे शब्दों में 775 की अनुमति है), और सटीक त्रुटि थी:

IOError: ऐसी कोई फ़ाइल या निर्देशिका नहीं।


2
जैसा कि S.Mark ने उल्लेख किया है, यह "सिर्फ काम" होना चाहिए। क्या संलग्नक निर्देशिका लेखन योग्य है?
राकिस

10
"यह मेरे लिए काम नहीं कर रहा है"? इसका क्या मतलब है, विशेष रूप से? कृपया वास्तविक त्रुटि संदेश प्रदान करें।
S.Lott

5
नीचे मुक्सी के जवाब ने काम किया (और उस बात के लिए बालू भी), लेकिन सिर्फ पूर्णता के लिए, एन्क्लोजिंग डीआईआर उपयोगकर्ता और समूह द्वारा लिखने योग्य था, अन्य नहीं (एक लिनक्स सिस्टम पर im ... इसलिए दूसरे शब्दों में 775 की अनुमति देता है), और सटीक त्रुटि IOError थी: ऐसी कोई फ़ाइल या निर्देशिका नहीं। मदद के लिए बहुत शुक्रिया दोस्तों।
trh178

@ एस.लॉट: किया गया। उसके लिए माफ़ करना।
trh178

सुनिश्चित करें कि सभी प्रमुख बनाने के फ़ोल्डरों के fileमौजूद है।
जेसन गोल

जवाबों:


804

आप का उपयोग करना चाहिए openसाथ w+मोड:

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

109
wमौजूदा फ़ाइल को काट देता है। डॉक्स: मोड्स 'r+', 'w+'और 'a+'अपडेट के लिए फाइल को खोलें (ध्यान दें कि 'w+'फाइल को छोटा करता है)।
साइलेंटगॉस्ट

4
यह चाल चली। धन्यवाद। मैं कल्पना नहीं पढ़ने के लिए अब एक बेवकूफ की तरह लग रहा है। मुझे नहीं लगता कि 'आरडब्ल्यू' वहां भी स्वीकार्य है। मैं कुछ और सोच रहा होगा।
tr1717

72
ध्यान दें कि a + फ़ाइल बनाता है यदि यह मौजूद नहीं है और, महत्वपूर्ण रूप से, फ़ाइल को अंत तक ढूंढता है। तो अगर आप इस तरह से खोलने के तुरंत बाद पढ़ते हैं, तो आपको कुछ नहीं मिलेगा। आपको पहले शुरुआत में वापस जाने की जरूरत है: f.seek (0)
Nick Zalutskiy


120
यह समाधान नहीं है। समस्या निर्देशिका है । या तो स्क्रिप्ट में उस निर्देशिका में फ़ाइल बनाने के लिए अनुमतियों का अभाव है, या निर्देशिका बस मौजूद नहीं है। open('myfile.dat', 'w')तब काफी है
डैनियल एफ

137

निम्नलिखित दृष्टिकोण का लाभ यह है कि फ़ाइल ब्लॉक के अंत में ठीक से बंद है , भले ही एक अपवाद रास्ते में उठाया गया हो। यह बराबर है try-finally, लेकिन बहुत कम है।

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

a + दोनों को जोड़ने और पढ़ने के लिए एक फ़ाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। फ़ाइल परिशिष्ट मोड में खुलती है। यदि फ़ाइल मौजूद नहीं है, तो यह पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है। - पायथन फ़ाइल मोड

तलाश () विधि फ़ाइल की वर्तमान स्थिति सेट करती है।

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
मैं इसे खुले (फ़ाइलनाम, 'a +') के साथ myfile के रूप में आज़माता हूं: और IOError प्राप्त करता हूं: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं: - यह फ़ाइल क्यों नहीं बनाता है?
लोरेटा

@ लॉरेटा आपने मूल्य की जाँच की है filename?
क्वर्टी

हाँ, मैंने किया। यह एक यूनिकोड स्ट्रिंग है। मैंने भी खुले ('{}। Txt'.format (फ़ाइल नाम),' a + ') को myfile के रूप में आज़माया:
लोरेटा

मैं एक रास्ते का उपयोग नहीं कर रहा हूं। और मैंने ओपन (.t test.txt ’, it a’) की कोशिश की, तो यह निम्न प्रकार का हो जाता है r TypeError: coercing to Unicode: need string or बफर, file found in the line if if if.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
किसी फ़ाइल को खोलने से पहले उसका परीक्षण करना बुरा है, क्योंकि इससे दौड़ की स्थिति पैदा हो सकती है (फ़ाइल को खोलने से पहले हटा दिया जाता है)। दौड़ की स्थितियों का उपयोग कभी-कभी एक प्रणाली में कमजोरियों का फायदा उठाने के लिए किया जा सकता है। "a +" मोड फ़ाइल को खोलने का सबसे अच्छा तरीका है: यह एक नई फ़ाइल बनाता है, और मौजूदा फ़ाइलों को जोड़ता है। इसे एक कोशिश में छोड़ना न भूलें / इसके अलावा।
स्लब्लैक

कंप्यूटिंग मोड लिखने या एपेंड में कोई दिलचस्पी नहीं है। यदि फ़ाइल मौजूद नहीं है, तो एपेंड मोड इसे बनाता है।
जीन फ़्राँस्वा Fabre


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

r + का मतलब है पढ़ना / लिखना



38
इससे भी बदतर, यह कोड एक दौड़ की स्थिति से ग्रस्त है। इस प्रकार, जाँचने के बाद कि क्या फ़ाइल मौजूद है, प्रक्रिया बाधित हो सकती है और दूसरी प्रक्रिया इस फ़ाइल को बना सकती है।
एंटीबॉडी

आपको "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उपयोग किए जाने पर अंतिम संशोधित समय को अपडेट करता है।
डेविड पार्क्स

@DavidParks अच्छी बात है, बस इसका परीक्षण किया और यह ext4 फाइल सिस्टम और python3.7.2 पर वास्तव में सच है। मुझे नहीं लगता कि यह इच्छित या इच्छित व्यवहार है, शायद यह बग wtih अजगर है?
ग्रैनिटोसॉरस

3
touchलिनक्स में कमांड लाइन का उपयोग करते समय एक ही बात , इसलिए मुझे लगता है कि यह इच्छित व्यवहार है।
डेविड पार्स


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 करें अजगर संस्करण का उपयोग कर रहा हूँ 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

अजगर 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

नोट: फ़ाइलों को खोलने के बाद उन्हें बंद करना होगा, और संदर्भ प्रबंधक के साथ आपके लिए पायथन को इस बात का ध्यान रखने का एक अच्छा तरीका है।


6

आप फ़ाइल के साथ क्या करना चाहते हैं? केवल इसे लिखना या पढ़ना और लिखना दोनों ही?

'w', 'a'लिखने की अनुमति देगा और अगर यह मौजूद नहीं है तो फ़ाइल बनाएगा।

यदि आपको किसी फ़ाइल से पढ़ने की आवश्यकता है, तो फ़ाइल को खोलने से पहले मौजूद होना चाहिए। आप इसे खोलने से पहले इसके अस्तित्व का परीक्षण कर सकते हैं या कोशिश / छोड़कर उपयोग कर सकते हैं


5
उद्घाटन से पहले अस्तित्व के लिए परीक्षण एक दौड़ की स्थिति का परिचय दे सकता है। शायद इस मामले में एक बड़ी बात नहीं है, लेकिन कुछ को ध्यान में रखना है।
डैनियल हेपर

1
"यदि आपको किसी फ़ाइल से पढ़ने की आवश्यकता है, तो फ़ाइल को खोलने से पहले मौजूद होना चाहिए।" मेरी पवित्रता को बचाने के लिए धन्यवाद।
ब्रायन पीटरसन

5

मुझे लगता है r+, यह नहीं है rw। मैं सिर्फ एक स्टार्टर हूं, और यही मैंने प्रलेखन में देखा है।


4

फ़ाइल लिखने के लिए w + डालें, यदि मौजूद है, तो r + फ़ाइल को पढ़ने के लिए, एक बनाने के लिए अगर यह मौजूद नहीं है, लेकिन लेखन नहीं है (और अशक्त लौट रहा है) या + एक नई फ़ाइल बनाने या किसी मौजूदा के लिए अपील करने के लिए।


1

तो आप किसी फ़ाइल में डेटा लिखना चाहते हैं, लेकिन केवल अगर यह पहले से मौजूद नहीं है तो?

सामान्य w मोड के बजाय () खोलने के लिए अल्प ज्ञात x मोड का उपयोग करके यह समस्या आसानी से हल हो गई है। उदाहरण के लिए:

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

हो सकता है यह मदद करेगा

पहले अपने py फ़ाइल में ओएस मॉड्यूल आयात करें

import os

उसके बाद save_file नाम का एक वैरिएबल बनाएं और इसे उस फाइल पर सेट करें जिसे आप html बनाना चाहते हैं या इस मामले में 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.