পাইথনে কোনও ফাইল পড়ার চেষ্টা করার সময় ব্যতিক্রমগুলি হ্যান্ডেল করার ভাল উপায় কী?


86

আমি পাইথনে একটি .csv ফাইলটি পড়তে চাই।

  • ফাইলটি আছে কিনা জানি না।
  • আমার বর্তমান সমাধান নীচে। এটি আমার কাছে ঝিমঝিম বোধ করে কারণ দুটি পৃথক ব্যতিক্রম পরীক্ষাগুলি অদ্ভুতভাবে জুস্টপোজড।

এটি করার কোনও সুন্দর উপায় আছে?

import csv    
fName = "aFile.csv"

try:
    with open(fName, 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            pass #do stuff here
    
except IOError:
    print "Could not read file:", fName

যদি অ-বিদ্যমান ফাইলটি কোনও ত্রুটিযুক্ত মামলা না হয় তবে একটি সম্ভাব্য পরিস্থিতি হয় তবে এর অনুপস্থিতি / অ-পঠনযোগ্যতার স্পষ্টভাবে পরীক্ষা করা এবং পরিচালনা করা (এবং অতিরিক্তভাবে ) tryসম্ভবত এটি উপযুক্ত। এটি যথাক্রমে os.path.exists(file)এবং সাথে করা যেতে পারে os.access(file, os.R_OK)। এই জাতীয় চেক কখনও কোনও রেসের শর্ত থেকে মুক্ত হতে পারে না তবে ফাইলগুলি অদৃশ্য হওয়া খুব কমই একটি সাধারণ পরিস্থিতি;)
স্টিফ্যান্ট

4
এই প্রশ্নের উত্তরগুলি সম্ভবত pathlibমডিউলটির ব্যবহার অন্তর্ভুক্ত করার জন্য আপডেট করা উচিত যা এই সমস্যাটিকে অনেক সহজ করে তোলে এবং সম্ভবত এটি স্ট্যান্ডার্ড পাইথন অনুশীলন হওয়া উচিত (বিশেষত এটি যেহেতু এটি ২. 2. এ ব্যাকপোর্টও করা হয়েছিল)।
রিক

যখন এটি ধরা পড়ে IOError, তখন csv.Errorফাইলটি সিএসভি ফর্ম্যাট না হওয়ার কারণে Dialect.strict=Trueবা Errorঅন্য কোনও ত্রুটির জন্য (সিএসভি প্যাকেজ ডক্স অনুসারে) ধরা পড়ে না, সুতরাং একটি বাহ্যিক চেষ্টা, বা কেবল কেবল ফাইলের জন্য পরীক্ষা করা উপস্থিত থাকে, তারপরে সিএসভি ব্যতিক্রমগুলির অভ্যন্তরীণ চেষ্টা হয় সম্ভবত সঠিক উত্তর।
গোলাপী স্পিকিহিরমণ

@ পিনপ্সপিক্যহিরমন হ্যাঁ, আপনার হ্যান্ডলার বাদে আপনি কোন ত্রুটি প্রকারটি পরিচালনা করতে চান তা সিদ্ধান্ত নিতে হবে। : এখান ত্রুটিগুলি একাধিক নির্দিষ্ট প্রকার পরিচালনা করতে দেখুন stackoverflow.com/questions/6470428/...
চার্লস Holbrow

উত্তর:


52

আমার ধারণা আমি কী ভুল জিজ্ঞাসা করা হয়েছিল তা ভুল বুঝেছিলাম। রি-রিডিং, দেখে মনে হচ্ছে টিমের উত্তর আপনি যা চান তা। যাইহোক আমাকে কেবল এটি যোগ করতে দাও: আপনি যদি কোনও ব্যতিক্রম ধরতে চান openতবে openঅবশ্যই একটিতে আবৃত থাকতে হবে try। কলে তাহলে openএকটি শিরোলেখ হয় with, তারপর withএকটি হতে হয়েছে tryব্যতিক্রম ধরা। এর আশেপাশে কোনও উপায় নেই।

সুতরাং উত্তরটি হ'ল: "টিমের পথ" বা "না, আপনি এটি সঠিকভাবে করছেন" "


পূর্ববর্তী অস্বাস্থ্যকর উত্তর যার প্রতি সমস্ত মন্তব্য উল্লেখ করেছে:

import os

if os.path.exists(fName):
   with open(fName, 'rb') as f:
       try:
           # do stuff
       except : # whatever reader errors you care about
           # handle error


23
কোনও ফাইল উপস্থিত থাকার অর্থ এই নয় যে আপনি এটি পড়তে পারেন!
গাবে

4
এটি নিখুঁত নয়, কারণ ফাইলটি এটি উপস্থিত রয়েছে কিনা তা খতিয়ে দেখা এবং এটি খোলার চেষ্টা করার মধ্যে (যেমন অন্য প্রক্রিয়া দ্বারা) মুছে ফেলা সম্ভব।
লিকুইড_ফায়ার

হয়তো আমি প্রশ্নটি ভুল বুঝছি। আসলে, আমি মনে করি আমি অবশ্যই আছি।
jscs

4
এটি এমনও সম্ভব যে fNameকোনও ফাইলের নামও হতে পারে যা এটি ঘিরে থাকলেও যে কোনও কারণেই খোলা যায় না - উদাহরণস্বরূপ, যদি এটি ডিরেক্টরি হয় বা এক্সিকিউটিভ প্রক্রিয়া দ্বারা এটি পড়ার অনুমতি না থাকলে।
অনুপ্রেরণা

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

64

এটি সম্পর্কে:

try:
    f = open(fname, 'rb')
except OSError:
    print "Could not open/read file:", fname
    sys.exit()

with f:
    reader = csv.reader(f)
    for row in reader:
        pass #do stuff here

10
এটির সাথে একমাত্র সমস্যা হ'ল ফাইলটি withব্লকের বাইরে খোলা আছে । সুতরাং tryকল openএবং withস্টেটমেন্ট সম্বলিত ব্লকের মধ্যে যদি কোনও ব্যতিক্রম ঘটে তবে ফাইলটি বন্ধ হয় না। এই ক্ষেত্রে, যেখানে জিনিসগুলি খুব সহজ, এটি কোনও সুস্পষ্ট সমস্যা নয়, তবে কোডটি পুনরায় সংশোধন বা অন্যথায় পরিবর্তন করার সময় এটি কোনও বিপদ ডেকে আনে। এটি বলা হচ্ছে, আমি মনে করি না এটি করার আরও ভাল উপায় আছে (মূল সংস্করণ ব্যতীত)।
প্রেরণা

4
@ বিনীত: ঠিক আছে আসলে, ওপি-র চূড়ান্ত উত্তর সম্ভবত সঠিক: না, আপনি যেভাবে এটি করেছেন তা সঠিক উপায়।
jscs

4
FileNotFoundError.mro() হয় [<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]এবং IOError.mro()হয় [<class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]। হয় OSErrorবা Exceptionপরিবর্তে ব্যবহার সম্পর্কে ? `` `
হটহোটো

4
@ হোটোহোটো: ভাল ধারণা আমি নিশ্চিত নই - সম্ভবত ২০১১ সাল থেকে ব্যতিক্রমী শ্রেণিবিন্যাস পরিবর্তিত হয়েছে তবে যাইহোক আপনার পরামর্শটি আরও পরিবেষ্টিত।
টিম পিটজ্যাকার

16

এখানে একটি পঠন / লেখার উদাহরণ। বিবৃতি সম্বলিত নিকটবর্তী () বিবৃতিটি কোনও ব্যতিক্রম নিক্ষেপ করা হয়েছে তা নির্বিশেষে ফাইল অবজেক্ট দ্বারা কল করা হবে। http://effbot.org/zone/python-with-statement.htm

import sys

fIn = 'symbolsIn.csv'
fOut = 'symbolsOut.csv'

try:
   with open(fIn, 'r') as f:
      file_content = f.read()
      print "read file " + fIn
   if not file_content:
      print "no data in file " + fIn
      file_content = "name,phone,address\n"
   with open(fOut, 'w') as dest:
      dest.write(file_content)
      print "wrote file " + fOut
except IOError as e:
   print "I/O error({0}): {1}".format(e.errno, e.strerror)
except: #handle other exceptions such as attribute errors
   print "Unexpected error:", sys.exc_info()[0]
print "done"

এই ক্ষেত্রে, আইওআররর সুস্পষ্ট তবে কোড কভারেজ দৃষ্টিকোণ থেকে কখন সাধারণ ব্যতিক্রম ঘটবে। আমি কীভাবে একটি সাধারণ ব্যতিক্রম উত্পন্ন করতে একটি কেস কেস করতে পারি।
মিয়া আসবাত আহমদ

0
fname = 'filenotfound.txt'
try:
    f = open(fname, 'rb')
except FileNotFoundError:
    print("file {} does not exist".format(fname))

file filenotfound.txt does not exist

ব্যতিক্রম ফাইলনটফাউন্ডএরার উত্থাপন যখন কোনও ফাইল বা ডিরেক্টরি অনুরোধ করা হয় তবে উপস্থিত নেই। ভুল ENOENT এর সাথে সম্পর্কিত।

https://docs.python.org/3/library/exception.html
পাইথন 2 এ এই ব্যতিক্রমটি বিদ্যমান নেই।


4
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড হাঁস

-12

@ জোশের উদাহরণে যোগ করা;

fName = [FILE TO OPEN]
if os.path.exists(fName):
    with open(fName, 'rb') as f:
        #add you code to handle the file contents here.
elif IOError:
    print "Unable to open file: "+str(fName)

এইভাবে আপনি ফাইলটি খোলার চেষ্টা করতে পারেন, তবে এটি উপস্থিত না থাকলে (যদি এটি একটি আইওআরার উত্থাপন করে), ব্যবহারকারীকে সতর্ক করুন!


সমস্যা দেখছি না। যদি এটি ভুল বাক্য গঠন হয় তবে এটি কার্যকর করার সময় একটি সিনট্যাক্স ত্রুটি বাড়ে!
জ্যাক ব্রাউন

7
সিনট্যাক্স ত্রুটি নয়, তবে bool(IOError)এটি সহজ Trueএবং ifকোনও ব্যতিক্রম ধরা দেয় না।

8
>>> if IOError: print "That's not an exception handler"
jscs

4
@ জোস ক্যাসওয়েল সঠিক। IOError সত্যকে মূল্যায়ন করে। docs.python.org/2.4/lib/truth.html
hecvd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.