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

11

我意识到这看起来和其他检查文件是否存在的问题类似,但实际上有所不同。我想弄清楚如何检查某个类型的文件是否存在,并在不存在时退出。我最初尝试的代码是:

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


你的单引号有一个拼写错误。 - Felix Yan
还有一个奇怪的非转义序列/n - Amadan
7个回答

12

在Python中,for语句有一个鲜为人知的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时才运行。


8

看一下 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
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)

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

for循环中的else语句很奇怪且不直观。使用break来表示循环成功而不是真正终止它,这很奇怪,与Python的哲学相反。

以下是一种漂亮的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

0

请查看 os.path.splitext(path) 函数,该函数的说明如下:

将路径名 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')
>>> 

0
我也有一张和你很相似的代码截图,但我的是一个判断是否有错误的代码。也许你能找到一些有用的东西。
for belge in tarama: 
    try:
        
        
        if belge.name.endswith('.docx') or belge.name.endswith('.doc'):
            Document(belge)
        
        elif belge.name.endswith('.pptx'):
            Presentation(belge)
            
        elif belge.name.endswith(".xlsx"):
            pd.read_excel(belge)
        
        elif belge.name.endswith(".pdf"):
            pdfpath=os.path.abspath(belge)
            PyPDF2.PdfReader(pdfpath)
            
        elif belge.name.endswith(".jpg") or belge.name.endswith(".jpeg"):
            jpgpath=os.path.abspath(belge)
            matplotlib.image.imread(jpgpath)
            
        else:
            yenipath=os.path.abspath(belge)
            tarama=os.scandir(yenipath)
        
            func(tarama)
            
    except :
        print ("Dosya açılmıyor !",belge.name)
     

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接