如何确认文件对象为空?[Python]

如何确认文件对象为空?[Python],python,file,is-empty,Python,File,Is Empty,在py模块中,我写: outFile = open(fileName, mode='w') if A: outFile.write(...) if B: outFile.write(...) 在这些行中,我没有使用flush或close方法。 然后在这些行之后,我想检查这个“outFile”对象是否为空。我如何处理它?您可以使用来获取文件信息: import os fileSize = os.stat(fileName).st_size 您的代码有一些问题 您不能。将写入使用

在py模块中,我写:

outFile = open(fileName, mode='w')
if A:
    outFile.write(...)
if B:
    outFile.write(...)
在这些行中,我没有使用flush或close方法。 然后在这些行之后,我想检查这个“outFile”对象是否为空。我如何处理它?

您可以使用来获取文件信息:

import os
fileSize = os.stat(fileName).st_size

您的代码有一些问题

  • 您不能
    。将
    写入使用
    'r'
    打开的文件。您需要
    打开(文件名为'w')

  • 如果
    A或B
    ,那么您肯定已写入该文件,因此它不是空的

  • 除此之外。您可以使用

    os.stat(outFile.fileno())
    

    编辑:我将解释
    flush
    的作用。Python通常用于执行大量的文件读取和写入,这可能会很慢。因此,对其进行了调整,使其尽可能快。这样做的一种方法是“缓冲”这样的写入,然后在一个大的块中完成它们:当您编写一个小字符串时,Python会记住它,但在它认为应该之前不会真正将它写入文件

    这意味着,如果要通过检查文件来判断是否已将数据写入文件,则必须告诉Python先写入它所记住的所有数据,否则可能看不到它
    flush
    是写入所有缓冲数据的命令


    当然,如果您询问Python是否向文件写入了任何内容,比如通过检查文件中的位置(
    .tell()
    ),则Python将了解缓冲。

    如果您已经向文件写入内容,则可以使用
    .tell()
    检查当前文件位置是否为非零:

    >>> handle = open('/tmp/file.txt', 'w')
    >>> handle.write('foo')
    >>> handle.tell()
    3
    
    如果将
    .seek()
    返回到文件的开头,则此操作无效

    with open("filename.txt", "r+") as f:
        if f.read(): 
            # file isn't empty
            f.write("something")
            # uncomment this line if you want to delete everything else in the file
            # f.truncate()
        else:
            # file is empty
            f.write("somethingelse")
    
    “r+”模式始终允许您进行读写操作。
    “with”将在模式下自动关闭文件
    'r'
    ,您不能使用
    write()
    。当您说“is empty”时,您的意思是什么?你的意思是“我写的数据到达磁盘了吗?”或者“在所有这些之后,我真的尝试写了什么吗?”@TokenMacGuy,即使我认为他说的是尚未刷新的数据。@TokenMacGuy,我的意思是我想确定我是否真的在文件对象中写入了一些内容,在我将刷新到磁盘之前。@AshwiniChaudhary谢谢。我已经更正了。re:#2,不一定,
    outFile.write(“”)
    什么都没写!Re:(2)——即使所写内容是非空的,也不意味着
    st_size
    还不是零。我刚刚做了一个测试,将
    “z”
    写入一个文件,然后立即调用
    os.stat
    ,得到
    st_size=0
    。[P.S.我认为
    os.stat
    接受路径,而不是
    fileno
    ]同意所有注释=)好吧,因为我还没有刷新,我认为它没有真正写入磁盘。因此,获取文件属性可能没有用处。@DSM那么,如何确保文件对象是否已写入?因此,如果我使用file.seek(0,2),那么file.tell()和tell()返回0,这是否意味着文件是空的?@ThunderEX:不,这只是意味着文件中的当前位置是
    0
    。但这不是来自文件对象,您可以让f读取(大小)这样您就不会为了检查文件是否为空而将整个文件加载到内存中,例如f.read(10)