检查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
。