我有一个文件操作,如果文件不存在或为空,则需要执行该操作,否则只需读取文件即可。我可以用类似的方法做到这一点:
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()
有没有更优雅的方式做到这一点?
答案 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。如果文件不存在,我们将其写入,如果目录名称相同,程序将停止,因为无法覆盖它/创建具有该名称的文件