我意识到这看起来类似于关于检查文件是否存在的其他问题,但它是不同的。我试图弄清楚如何检查文件的类型是否存在,如果不存在则退出。我最初尝试的代码是:
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 :(得分: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')
>>>