2011-04-11 8 views
32

मैं अजगर में एक .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 
+0

, गैर-मौजूद फ़ाइल एक त्रुटि मामला नहीं है, लेकिन एक संभावना परिस्थिति तो नहीं लगा पाएगा और स्पष्ट रूप से पहले अपनी अनुपस्थिति/गैर पठनीयता से निपटने (और * अतिरिक्त * करने के लिए) 'try' इसके लायक हो सकता है । यह क्रमशः 'os.path.exists (फ़ाइल)' और 'os.access (फ़ाइल, os.R_OK)' के साथ किया जा सकता है। ऐसी जांच कभी भी दौड़ की स्थिति से मुक्त नहीं हो सकती है, लेकिन फाइलों को गायब करना कभी-कभी सामान्य परिस्थिति नहीं होता है;) – stefanct

+1

इस प्रश्न का उत्तर शायद 'pathlib' मॉड्यूल के उपयोग को शामिल करने के लिए अपडेट किया जाना चाहिए, जो इस समस्या को बहुत आसान बनाता है, और शायद मानक पायथन अभ्यास होना चाहिए (विशेष रूप से क्योंकि इसे 2.7 तक भी वापस भेज दिया गया था)। –

उत्तर

17

मुझे लगता है कि मुझे क्या समझा जा रहा था गलत समझा। फिर से पढ़ना, ऐसा लगता है कि टिम का जवाब वह है जो आप चाहते हैं। मुझे बस इसे जोड़ने दें, हालांकि: यदि आप 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 

+7

सिर्फ इसलिए कि एक फ़ाइल मौजूद है इसका मतलब यह नहीं है कि आप इसे पढ़ सकते हैं! – Gabe

+1

यह सही नहीं है, क्योंकि यह संभव है कि फ़ाइल को हटा दिया जाए (उदाहरण के लिए किसी अन्य प्रक्रिया द्वारा) यह जांचने के बीच कि यह मौजूद है और इसे खोलने का प्रयास कर रहा है। –

+0

शायद मैं इस सवाल को गलत समझ रहा हूं। वास्तव में, मुझे लगता है कि मैं निश्चित रूप से हूं। –

17

कैसे इस बारे में:

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

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

इसके साथ एकमात्र समस्या यह है कि फ़ाइल 'ब्लॉक' के बाहर खोला गया है। इसलिए यदि 'try' ब्लॉक' के साथ 'try' ब्लॉक' और 'with' कथन' के बीच कोई अपवाद होता है, तो फ़ाइल बंद नहीं होती है। इस मामले में, जहां चीजें बहुत सरल होती हैं, यह एक स्पष्ट मुद्दा नहीं है, लेकिन कोड को दोबारा सुधारने या अन्यथा संशोधित करते समय भी यह खतरे में पड़ सकता है। ऐसा कहा जा रहा है, मुझे नहीं लगता कि ऐसा करने का एक बेहतर तरीका है (मूल संस्करण के अलावा)। – intuited

+1

@intuited: यह सही है। वास्तव में, ओपी का अंतिम जवाब शायद यह है: नहीं, जिस तरह से आपने इसे किया है वह सही तरीका है। –

-3

@ जोश उदाहरण के लिए जोड़ रहा है;

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) 

इस तरह आप फ़ाइल को खोलने का प्रयास कर सकते हैं, लेकिन अगर यह मौजूद नहीं है (अगर यह एक IOError को जन्म देती है), उपयोगकर्ता को सचेत!

+2

'elif IOError'? गंभीरता से? @ जोश के प्रस्ताव पर टिप्पणियां भी देखें, जो कम से कम सिंटैक्स सही हो जाती है। – delnan

+0

समस्या को नहीं देख रहा है। अगर यह गलत वाक्यविन्यास था तो निष्पादित होने पर यह वाक्यविन्यास त्रुटि उत्पन्न करेगा! –

+4

कोई वाक्यविन्यास त्रुटि नहीं है, लेकिन 'बूल (IOError)' बस 'True' है और' if' को कोई अपवाद नहीं है। – delnan

6

यहां एक पढ़ा/लिखना उदाहरण है। बयान के साथ बीमा() कथन को फ़ाइल ऑब्जेक्ट द्वारा बुलाया जाएगा चाहे इस पर ध्यान दिए बिना कि अपवाद फेंक दिया गया है या नहीं। 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" 
संबंधित मुद्दे

 संबंधित मुद्दे