如果..否则:是否有更好的方法来处理此问题?

时间:2019-06-15 19:31:32

标签: python

我有一个文件操作,如果文件不存在或为空,则需要执行该操作,否则只需读取文件即可。我可以用类似的方法做到这一点:

def Write_File():
    [some code to write the file]

Exists = os.path.exists('filename')
if Exists:
    Fsize = os.path.getsize('filename')
    if Fsize > 0:
        [some code to read the file]
    else:
        Write_File()
else:
    Write_File()

有没有更优雅的方式做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

import os

def write_file(filename)
    [some code to write the file]

def read_file(filename)
    [some code to read the file]

filename = 'path/to/filename'


try:
    if os.path.exists(filename) and os.stat(filename).st_size > 0:
       # file exists and not empty
       read_file(filename)
    else:
       print('file doesnot exists')
       write_file(filename)
except OSError as e:
       # error generated because of trying to get size of a non-existent file 
       print(e)

答案 1 :(得分:0)

我的第一个想法是尝试getsize并捕获异常,而不是测试文件是否存在,默认文件大小为0。

但是如果对象是目录,getsize将返回0。因此,您也想测试对象类型(使用os.path.isdir())。使用大量os调用会花费时间,特别是在速度较慢的文件系统上,因此最快的方法是使用stat,它可以在一个系统调用中获取所有信息。

import stat,os
filename = 'filename'
fsize = 0
try:
   sobj = os.stat(filename)
   if stat.S_ISDIR(sobj.st_mode):
      raise Exception("{} is a directory, cannot continue".format(filename))
   fsize = sobj.st_size
except OSError:
    pass

if fsize:  # we can omit > 0, fsize cannot be negative
    [some code to read the file]
else:
    Write_File()

在上面的代码段中,fsize仅在文件存在且确实是文件时才大于0。如果文件不存在,我们将其写入,如果目录名称相同,程序将停止,因为无法覆盖它/创建具有该名称的文件