2012-02-29 13 views
9

में मौजूद है, मुझे एहसास है कि यह जांचने के बारे में अन्य प्रश्नों के समान दिखता है कि फ़ाइल मौजूद है या नहीं, लेकिन यह अलग है। मैं यह पता लगाने की कोशिश कर रहा हूं कि टाइप करें फ़ाइल मौजूद है और बाहर निकलने पर बाहर निकलें। कोड मैं मूल रूप से करने की कोशिश की है:जांचें कि एक * प्रकार * फ़ाइल पाइथन

filenames = os.listdir(os.curdir) 

for filename in filenames: 

    if os.path.isfile(filename) and filename.endswith('.fna'): 
     ##do stuff 

यह काम करता है के लिए फ़ाइल है कि .fna में समाप्त होता है के लिए 'चीजें करते', लेकिन मैं जाँच करें और सुनिश्चित करें कि .fna फ़ाइल नहीं है बनाने के लिए और कार्यक्रम बाहर निकलने के लिए इसकी जरूरत पूरी तरह से अगर नहीं।

मैंने कोशिश की यह:

try: 

    if os.path.isfile(filename) and filename.endswith('.fna'): 
     ## Do stuff 
except: 

    sys.stderr.write (‘No database file found. Exiting program. /n’) 
    sys.exit(-1) 

लेकिन वह काम नहीं किया है, यह सिर्फ पूरे समारोह को छोड़ देता है, तो .fna फ़ाइल, वहाँ नहीं है त्रुटि मुद्रण के बिना।

+0

और आप अपने अकेले-उद्धरण चिह्न –

+0

और एक अजीब गैर एस्केप अनुक्रम '/ n' लिखने में कोई गलती की है। – Amadan

उत्तर

1
filenames = os.listdir(os.curdir) 
found = False 
for filename in filenames: 
    if os.path.isfile(filename) and filename.endswith('.fna'): 
     found = True 
if not found: 
    sys.stderr.write ('No database file found. Exiting program. \n') 
    sys.exit(-1) 
9

for statement in Python एक अल्पज्ञात else खंड है:

for filename in filenames: 
    if os.path.isfile(filename) and filename.endswith(".fna"): 
     # do stuff 
     break 
else: 
    sys.stderr.write ('No database file found. Exiting program. \n') 
    sys.exit(-1) 

else खंड केवलचलाया जाता है, तो for बयान पाश अंदर break को क्रियान्वित करने के बिना अपनी पूरी गणना के माध्यम से चलाता है। glob मॉड्यूल पर

7

देखो:

import glob 
import os 
import sys 

databases = filter(os.path.isfile, glob.glob('./*.fna')) 

if not databases: 
    sys.stderr.write("No database found.\n\n") 
    exit(1) 

for database in databases: 
    do_something_with(database) 
+0

वह पाइथनिक कैसे है, ओह? –

0

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

try: 
    # No if statement doing the check 
    # Start doing stuff assuming abc.fna exists 
except: 
    # Uh oh! Something went bad. 
    # Display error messages, clean up, carry on 

स्पष्ट करने के लिए कोड का टुकड़ा पर विचार करें:

try: 
    with open('hi.txt') as f: 
     print f.readlines() 
except: 
    print 'There is no hi.txt!' 
0

आपका try/except ब्लॉक क्योंकि os.path.isfile काम नहीं किया अगर यह विफल एक अपवाद फेंक नहीं है; यह केवल False देता है।

elsefor लूप के लिए खंड अजीब और गैर-सहज ज्ञान युक्त हैं। break का उपयोग यह इंगित करने के लिए कि लूप वैध रूप से तोड़ने के बजाय सफल था, यह अजीब है, और पायथन के दर्शन के विपरीत है।

want = lambda f: os.path.isfile(f) and f.endswith(".fna") 
valid_files = [f for f in os.listdir(os.curdir) if want(f)] 
if len(valid_files) == 0: 
    print >>sys.stderr, "failed to find .fna files!" 
    sys.exit(1) 
for filename in valid_files: 
    # do stuff 
0

चेक बाहर os.path.splitext (पथ) समारोह जो कहते हैं:

स्प्लिट पथ पथ एक जोड़ी में

यहाँ एक अच्छा, ऐसा करने का pythonic तरीका तुम क्या चाहते हो (रूट, एक्सटी) जैसे रूट + ext == पथ, और ext खाली है या एक अवधि के साथ शुरू होता है और इसमें एक अवधि होती है। बेसनाम पर अग्रणी अवधि को नजरअंदाज कर दिया जाता है; splitext ('cshrc') रिटर्न ('.cshrc', '')।

यहाँ एक उदाहरण है:

>>> os.path.splitext("./01The News from Lake Wobegon/AlbumArtSmall.jpg") 
('./01The News from Lake Wobegon/AlbumArtSmall', '.jpg') 
>>> 
संबंधित मुद्दे