如何检查文件是否为空?


Answers:


348
>>> import os
>>> os.stat("file").st_size == 0
True

11
stat.ST_SIZE而不是6
wRAR 2010年

2
也可以 但我不想导入统计信息。它简短而甜美,返回列表中的大小位置不会很快改变。
ghostdog74 2010年

61
@wRAR:os.stat('file')。st_size更好
Daniel Stutzbach 2010年

2
请注意,文件类型也适用于json。有时,用于空文件的json.load()无法正常工作,这提供了一种处理这种情况的好方法
seokhoonlee

如果文件仅包含换行/空白怎么办?错误的答案!
阿卜杜拉赛义德

121
import os    
os.path.getsize(fullpathhere) > 0

8
为了安全起见,您可能需要捕获OSError并返回False。
kennytm 2010年

5
使用此vs os.state('file')。st_size有什么区别/优势?
伊利亚·林恩

2
看起来两者
1''

我可以将其应用于文件夹路径吗?@Jon
alper

71

双方getsize()stat()会抛出一个异常,如果该文件不存在。此函数将返回True / False而不抛出(更简单但更不可靠):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

绝对喜欢使用os.path.getsize()
David Gay

9
存在争用条件,因为可能在调用os.path.isfile(fpath)和之间删除文件os.path.getsize(fpath),在这种情况下,建议的函数将引发异常。
s3rvac

3
最好尝试抓住它OSError,就像在另一条评论中提出的那样
j08lue

还需要捕获TypeError在输入fpath为的情况下将引发的异常None
Trutane

25

如果由于某种原因您已经打开了文件,则可以尝试以下操作:

>>> with open('New Text Document.txt') as my_file:
...     # I already have file open at this point.. now what?
...     my_file.seek(0) #ensure you're at the start of the file..
...     first_char = my_file.read(1) #get the first character
...     if not first_char:
...         print "file is empty" #first character is the empty string..
...     else:
...         my_file.seek(0) #first character wasn't empty, return to start of file.
...         #use file now
...
file is empty

9

好吧,我将把ghostdog74的答案和评论结合起来,只是为了好玩。

>>> import os
>>> os.stat('c:/pagefile.sys').st_size==0
False

False 表示非空文件。

因此,让我们编写一个函数:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0

8

如果您将Python3与一起使用,则pathlib可以os.stat()使用Path.stat()方法访问信息,该方法具有属性st_size(文件大小,以字节为单位):

>>> from pathlib import Path 
>>> mypath = Path("path/to/my/file")
>>> mypath.stat().st_size == 0 # True if empty

4

如果您有文件对象,那么

>>> import os
>>> with open('new_file.txt') as my_file:
...     my_file.seek(0, os.SEEK_END) # go to end of file
...     if my_file.tell(): # if current position is truish (i.e != 0)
...         my_file.seek(0) # rewind the file for later use 
...     else:
...         print "file is empty"
... 
file is empty

这个答案应该有更多的票,因为它实际上检查文件是否有任何内容。
amanb

1

一个重要的陷阱:使用或函数测试时,压缩的空文件将显示为非零:getsize()stat()

$ python
>>> import os
>>> os.path.getsize('empty-file.txt.gz')
35
>>> os.stat("empty-file.txt.gz").st_size == 0
False

$ gzip -cd empty-file.txt.gz | wc
0 0 0

因此,您应该检查要测试的文件是否已压缩(例如检查文件名后缀),如果是,则将其保释或将其解压缩到临时位置,测试未压缩的文件,然后在完成后将其删除。


1

由于您尚未定义什么是空文件。有些人可能会认为只有空白行的文件也是空文件。因此,如果要检查文件是否仅包含空白行(任何空白字符,'\ r','\ n','\ t'),则可以按照以下示例进行操作:

Python3

import re

def whitespace_only(file):
    content = open(file, 'r').read()
    if re.search(r'^\s*$', content):
        return True

说明:上面的示例使用正则表达式(regex)来匹配content文件的内容()。
特别是:对于:的正则表达式:^\s*$整体表示文件中是否仅包含空白行和/或空格。
- ^在行的开头断言位置
- \s匹配任何空格字符(等于[\ r \ n \ t \ f \ v])
- *量词-尽可能在零和无限次数之间进行匹配,并根据需要返回(贪婪)
- $在行尾声明位置


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.