2012-02-29 2 views
9

Я понимаю, что это похоже на другие вопросы о проверке наличия файла, но это другое. Я пытаюсь выяснить, как проверить, существует ли файл файла и выйти, если он этого не делает. Код, который я пытался первоначально это:Проверьте, что существует * тип * файла в Python

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

The 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 внутри цикла.

7

Посмотрите на glob модуля:

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

Как это pythonic, а? –

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.

else статьи за for Петли странные и неинтуитивные. Используя break, чтобы показать, что цикл был успешным, а не законным нарушением, это просто странно и противоречит философии Python.

Вот хороший, Pythonic способ делать то, что вы хотите:

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 функция (путь), который говорит:

Разбить путь путь в паре (root, ext), так что root + ext == path и ext пуст или начинается с периода и содержит не более одного периода. Ведущие периоды в basename игнорируются; splitext ('.cshrc') возвращает ('.cshrc', '').

Вот пример:

>>> os.path.splitext("./01The News from Lake Wobegon/AlbumArtSmall.jpg") 
('./01The News from Lake Wobegon/AlbumArtSmall', '.jpg') 
>>> 
Смежные вопросы