পাইথন-এ ওপেন () কোনও ফাইল বিদ্যমান না থাকলে এটি তৈরি করে না


660

ফাইল উপস্থিত / পড়তে লিখতে খোলার সর্বোত্তম উপায় কোনটি যদি না থাকে বা না থাকে তবে তা তৈরি করে এটি পড়ুন / লেখার মতো খুলুন? আমি যা পড়েছি তা থেকে,file = open('myfile.dat', 'rw') এই কি করা উচিত?

এটি আমার পক্ষে কাজ করছে না (পাইথন ২.6.২) এবং আমি ভাবছি এটি কোনও সংস্করণের সমস্যা কিনা, বা এর মতো বা কী কাজ করার কথা নয়।

মূল কথাটি হ'ল, আমার সমস্যার সমাধান দরকার just আমি অন্যান্য জিনিসগুলি সম্পর্কে কৌতূহল বোধ করি তবে খালি অংশটি করার জন্য আমার যা দরকার তা হল একটি দুর্দান্ত উপায়।

এনকোলেজিং ডিরেক্টরিটি ব্যবহারকারী এবং গোষ্ঠী দ্বারা রচনাযোগ্য ছিল, অন্য নয় (আমি লিনাক্স সিস্টেমে আছি ... সুতরাং অন্য কথায় 775 অনুমতি রয়েছে), এবং সঠিক ত্রুটিটি ছিল:

আইওআরর: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই।


2
এস.মার্ক যেমন উল্লেখ করেছেন, এটি "কেবলমাত্র কাজ করা" উচিত। এনকোলেজিং ডিরেক্টরিটি কি লেখার যোগ্য?
রাকিস

10
"এটা আমার পক্ষে কাজ করছে না"? বিশেষত এর অর্থ কী? দয়া করে প্রকৃত ত্রুটি বার্তা সরবরাহ করুন।
এস .লট

5
মুকসির উত্তর নীচে কাজ করেছে (এবং বালুর বিষয়টিও সেই ক্ষেত্রে) তবে কেবল সম্পূর্ণতার জন্য, ঘেরের ডিরটি ব্যবহারকারী এবং গোষ্ঠী দ্বারা লিখিত ছিল, অন্য নয় (একটি লিনাক্স সিস্টেমে থাকায় ... সুতরাং অন্য কথায় 7 permission75 অনুমতি রয়েছে), এবং সঠিক ত্রুটিটি ছিল আইওআরআর: এরকম কোনও ফাইল বা ডিরেক্টরি নেই। সাহায্য বলছি জন্য ধন্যবাদ.
trh178

@ এসলট: সম্পন্ন হয়েছে। এর জন্যে দুঃখিত.
trh178

নিশ্চিত করুন যে সমস্ত নেতৃস্থানীয় করা ফোল্ডার এর fileবিদ্যমান।
জেসন গোল

উত্তর:


804

openআপনার w+মোডের সাথে ব্যবহার করা উচিত :

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

109
wবিদ্যমান ফাইল কেটে দেয়। দস্তাবেজ: মোডগুলি 'r+', 'w+'এবং 'a+'আপডেট করার জন্য ফাইল খোলার (নোট যে 'w+'কাটছাঁট করে ফাইল)।
সাইলেন্টগোস্ট

4
এই কৌশলটি করেছে। ধন্যবাদ. অনুমানটি না পড়ার জন্য আমার এখন বোকা মনে হচ্ছে। আমি মনে করি না যে সেখানে 'আরডব্লু' এমনকি গ্রহণযোগ্য। আমি অবশ্যই অন্য কিছু ভাবছিলাম।
trh178

72
নোট করুন যে একটি + একটি ফাইল তৈরি করে যদি এটি বিদ্যমান না থাকে এবং গুরুত্বপূর্ণভাবে, ফাইলটি শেষ পর্যন্ত সন্ধান করে। সুতরাং আপনি যদি এইভাবে খোলার সাথে সাথে একটি পঠন করেন তবে কিছুই পাবেন না। আপনাকে প্রথমে প্রথম দিকে ফিরে যেতে হবে: f.seek (0)
নিক জালুটস্কি


120
এটি সমাধান নয়। সমস্যা ডিরেক্টরি হয় । হয় স্ক্রিপ্টের সেই ডিরেক্টরিতে একটি ফাইল তৈরি করার অনুমতিগুলির অভাব রয়েছে, বা ডিরেক্টরিটি কেবল উপস্থিত নেই। open('myfile.dat', 'w')তাহলে যথেষ্ট।
ড্যানিয়েল এফ

137

নিম্নলিখিত পদ্ধতির সুবিধা হ'ল ফাইলটি ব্লকের শেষে যথাযথভাবে বন্ধ হয়ে গেছে , এমনকি পথে পথে কোনও ব্যতিক্রম উত্থাপন করা হলেও। এটি সমান try-finally, তবে আরও খাটো sh

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
আমি মাইফিল হিসাবে খোলার (ফাইলের নাম, 'এ +') দিয়ে এটি চেষ্টা করে: এবং আইওআরআর পাই: [এর্নো 2] এরকম কোনও ফাইল বা ডিরেক্টরি নেই: - কেন এটি ফাইল তৈরি করে না?
Loretta

@ লোরেট্টা আপনি কি এর মান পরীক্ষা করেছেন filename?
কিওয়ার্টি

হ্যা, আমি করেছিলাম. এটি একটি ইউনিকোড স্ট্রিং। আমি মাইফিল হিসাবে খোলার ('t t। Txt'.format (ফাইলের নাম),' এ + ') দিয়েও চেষ্টা করেছি:
লোরেট্টা

আমি কোন পথ ব্যবহার করছি না এবং আমি খোলার চেষ্টা করেছি ('test.txt', 'a +') এটি ব্যতিক্রম পেয়েছে 'TypeError: ইউনিকোডে জোর দেওয়া: স্ট্রিং বা বাফার দরকার, লাইনে ফাইল পাওয়া গেছে' os.stat (মাইফাইল) .st_size == 0:
Loretta

এটি কাজ করার জন্য আপনাকে এনকোডিং সঠিকভাবে সংজ্ঞায়িত করতে হবে। স্ট্যাকওভারফ্লো.com
q/728891/

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
ফাইলটি খোলার আগে এটি পরীক্ষা করা খারাপ, কারণ এটি রেসের অবস্থার দিকে নিয়ে যেতে পারে (ফাইলটি খোলার আগেই মুছে ফেলা হয়)। রেস শর্তগুলি কখনও কখনও কোনও সিস্টেমে দুর্বলতা কাজে লাগাতে ব্যবহার করা যেতে পারে। ফাইলটি খোলার সেরা উপায় "এ +" মোড: এটি একটি নতুন ফাইল তৈরি করে এবং বিদ্যমান ফাইলগুলিতে সংযোজন করে। বাদ দিয়ে / চেষ্টা করে এটিকে মোড়ানো ভুলবেন না।
45

কম্পিউটিং মোড লেখার বা সংযোজনের কোনও আগ্রহ নেই। যদি ফাইলটি বিদ্যমান না থাকে তবে সংযোজন মোড এটি তৈরি করে।
জিন-ফ্রান্সোইস ফ্যাব্রে


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

r + এর অর্থ পঠন / লেখা



38
আরও খারাপ, এই কোডটি একটি রেসের শর্তে প্রবণ। সুতরাং, ফাইলটি উপস্থিত রয়েছে কিনা তা যাচাই করার পরে, প্রক্রিয়াটি বাধাগ্রস্থ হতে পারে এবং অন্য একটি প্রক্রিয়া এই ফাইলটি তৈরি করতে পারে।
অ্যান্টিবাস

আপনার "ডাব্লু +" পতাকাও লাগবে যাতে উভয় ফাইলই পঠন এবং লেখার মোডে থাকবে।
ম্যাট

14

পাইথন ৩.৪ থেকে আপনার "স্পর্শ" ফাইলগুলি ব্যবহার করা উচিত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ব্যবহারের সময় সর্বশেষ পরিবর্তিত সময় আপডেট করে।
ডেভিড পার্কগুলি

@ ডেভিডপর্কস ভাল পয়েন্টটি করেছেন, এটি কেবল পরীক্ষা করেছে এবং এটি এক্সট 4 ফাইল সিস্টেম এবং পাইথন3.7.2-তে সত্য। আমি মনে করি না এটি উদ্দেশ্যযুক্ত বা কাঙ্ক্ষিত আচরণ, সম্ভবত এটি একটি বাগ অজগর?
গ্রানিতোসরাস

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

আশা করি এটা কাজে লাগবে. [এফওয়াইআই পাইথন সংস্করণ ৩.6.২ ব্যবহার করছে]


6

open('myfile.dat', 'a') আমার জন্য কাজ করে, ঠিক আছে।

পাই কোডে আপনার কোড উত্থাপন করেছে 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

পাইথন -২.। এ এটি উত্থাপন করে 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

ফাইলটি লেখার জন্য ডাব্লু + লিখুন, এটি বিদ্যমান থাকলে ছাঁটাই, ফাইলটি পড়তে r +, এটি উপস্থিত না থাকলে একটি তৈরি করা কিন্তু লেখার জন্য নয় (এবং নাল ফিরে) অথবা একটি নতুন ফাইল তৈরি করার জন্য বা একটি বিদ্যমানতে সংযোজন করার জন্য একটি + রাখুন।


1

সুতরাং আপনি কোনও ফাইলে ডেটা লিখতে চান, তবে কেবল যদি এটি ইতিমধ্যে বিদ্যমান না থাকে ?.

এই সমস্যাটি সহজেই ডাব্লু মোডের পরিবর্তে () খোলার জন্য অল্প পরিচিত 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'
  >>>

ফাইলটি যদি বাইনারি মোড হয় তবে এক্সটিএসের পরিবর্তে মোড এক্সবি ব্যবহার করুন।


1

আপনি যদি এটি পড়তে এবং লেখার জন্য এটি খুলতে চান তবে আমি ধরে নিচ্ছি যে আপনি এটি খোলার সাথে সাথে এটি কেটে ফেলতে চান না এবং আপনি ফাইলটি খোলার সাথে সাথেই পড়তে সক্ষম হতে চান। সুতরাং এটিই আমি সমাধানটি ব্যবহার করছি:

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

0

এই সাহায্য করবে হতে পারে

আপনার পাই ফাইলের মধ্যে প্রথমে ওএস মডিউলটি আমদানি করুন

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.