检查Python中是否存在*类型*文件

时间:2012-02-29 01:46:28

标签: 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文件不存在,它只是跳过整个函数,而不打印错误。

6 个答案:

答案 0 :(得分:10)

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子句仅运行

答案 1 :(得分: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)

答案 2 :(得分: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)

答案 3 :(得分: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!'

答案 4 :(得分: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

答案 5 :(得分:0)

查看os.path.splitext(path)函数,其中包含:

  

将路径名路径拆分为一对(root,ext),使root + ext == path,ext为空或以句点开头,最多包含一个句点。基本名称的前导句点被忽略; splitext('。cshrc')返回('。cshrc','')。

以下是一个例子:

>>> os.path.splitext("./01The News from Lake Wobegon/AlbumArtSmall.jpg")
('./01The News from Lake Wobegon/AlbumArtSmall', '.jpg')
>>>