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

检查Python中是否存在*类型*的文件,python,Python,我意识到这与其他关于检查文件是否存在的问题类似,但不同。我试图找出如何检查类型的文件是否存在,如果不存在则退出。我最初尝试的代码是: filenames = os.listdir(os.curdir) for filename in filenames: if os.path.isfile(filename) and filename.endswith('.fna'): ##do stuff 这可以对以.fna结尾的文件进行“处理”,但我需要它检查并确保.fna文件在

我意识到这与其他关于检查文件是否存在的问题类似,但不同。我试图找出如何检查类型的文件是否存在,如果不存在则退出。我最初尝试的代码是:

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

有一个鲜为人知的
else
子句:

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)
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

有一个鲜为人知的
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
时才运行。

查看模块:

请看模块:


如果您使用的是异常,请不要测试该文件是否存在。这就是为什么要从异常开始

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!'

如果您使用的是异常,请不要测试该文件是否存在。这就是为什么要从异常开始

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!'

您的
try
/
except
块无法工作,因为
os.path.isfile
在失败时不会引发异常;它只返回
False

else
循环的
for
子句既奇怪又不直观。使用
break
来表示循环是成功的,而不是合法地中断循环,这很奇怪,而且与Python的理念相反

这里有一个很好的,类似于蟒蛇的方法来做你想做的事情:

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

您的
try
/
except
块无法工作,因为
os.path.isfile
在失败时不会引发异常;它只返回
False

else
循环的
for
子句既奇怪又不直观。使用
break
来表示循环是成功的,而不是合法地中断循环,这很奇怪,而且与Python的理念相反

这里有一个很好的,类似于蟒蛇的方法来做你想做的事情:

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
查看os.path.splitext(path)函数,该函数显示:

将路径名路径拆分为一对(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')
>>> 
查看os.path.splitext(path)函数,该函数显示:

将路径名路径拆分为一对(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')
>>> 

你的单引号中有一个输入错误和一个奇怪的非转义序列
/n
。你的单引号中有一个输入错误和一个奇怪的非转义序列
/n