Bagaimana cara memeriksa apakah suatu file kosong atau tidak?

Jawaban:

348
>>> import os
>>> os.stat("file").st_size == 0
True
ghostdog74
sumber
11
stat.ST_SIZEbukannya 6
wRAR
2
itu baik juga. tetapi saya tidak ingin mengimpor stat. Cukup pendek dan manis dan posisi ukuran dalam daftar yang dikembalikan tidak akan berubah dalam waktu dekat.
ghostdog74
61
@wRAR: os.stat ('file'). st_size bahkan lebih baik
Daniel Stutzbach
2
Perhatikan bahwa tipe file juga berfungsi untuk json. Terkadang, json.load () untuk file kosong tidak berfungsi dan ini memberikan cara yang baik untuk menangani kasus itu
seokhoonlee
bagaimana jika file hanya berisi baris baru / kosong? jawaban yang salah!
lone_coder
121
import os    
os.path.getsize(fullpathhere) > 0
Jon
sumber
8
Untuk keamanan Anda mungkin perlu menangkap OSErrordan mengembalikan False.
kennytm
5
Apa perbedaan / keuntungan menggunakan ini vs os.state ('file'). St_size?
Elijah Lynn
2
Sepertinya keduanya sama di bawah tenda: stackoverflow.com/a/18962257/1397061
1 ''
Bisakah saya menerapkannya untuk jalur folder? @Jon
alper
71

Keduanya getsize()dan stat()akan melempar pengecualian jika file tidak ada. Fungsi ini akan mengembalikan Benar / Salah tanpa melempar (lebih sederhana tetapi kurang kuat):

import os
def is_non_zero_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
ronedg
sumber
Pasti suka menggunakanos.path.getsize()
David Gay
9
Ada kondisi ras karena file dapat dihapus antara panggilan ke os.path.isfile(fpath)dan os.path.getsize(fpath), dalam hal ini fungsi yang diusulkan akan menimbulkan pengecualian.
s3rvac
3
Lebih baik mencoba dan menangkap OSErrorsaja, seperti yang diusulkan dalam komentar lain .
j08lue
Juga perlu menangkap TypeErroryang akan dinaikkan jika input fpath None.
Trutane
25

jika karena suatu alasan Anda sudah membuka file Anda dapat mencoba ini:

>>> 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
raja robert
sumber
9

Ok jadi saya akan menggabungkan jawaban ghostdog74 dan komentarnya, hanya untuk bersenang-senang.

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

False berarti file yang tidak kosong.

Jadi mari kita tulis fungsi:

import os

def file_is_empty(path):
    return os.stat(path).st_size==0
Ron Klein
sumber
8

Jika Anda menggunakan Python3 dengan pathlibAnda dapat mengakses os.stat()informasi menggunakan Path.stat()metode, yang memiliki atribut st_size(ukuran file dalam byte):

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

jika Anda memiliki objek file, maka

>>> 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
Qlimax
sumber
Jawaban ini seharusnya memiliki lebih banyak suara karena sebenarnya memeriksa apakah file memiliki konten sama sekali.
amanb
1

Gotcha penting: file kosong terkompresi akan tampak tidak nol ketika diuji dengan getsize()atau stat()fungsinya:

$ 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

Jadi, Anda harus memeriksa apakah file yang akan diuji dikompresi (mis., Periksa akhiran nama file) dan jika demikian, bail atau buka kompresi ke lokasi sementara, uji file yang tidak dikompresi, dan kemudian hapus ketika selesai.

Trutane
sumber
1

Karena Anda belum menentukan apa file kosong itu. Beberapa orang mungkin menganggap file hanya dengan baris kosong dan juga file kosong. Jadi, jika Anda ingin memeriksa apakah file Anda hanya berisi baris kosong (karakter spasi apa saja, '\ r', '\ n', '\ t') , Anda dapat mengikuti contoh di bawah ini:

Python3

import re

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

Jelaskan: contoh di atas menggunakan ekspresi reguler (regex) untuk mencocokkan konten ( content) file.
Khususnya: untuk regex dari: ^\s*$secara keseluruhan berarti jika file hanya berisi baris kosong dan / atau spasi kosong.
- ^menegaskan posisi pada awal garis
- \scocok dengan karakter spasi apa pun (sama dengan [\ r \ n \ t \ f \ v])
- *Kuantifikasi - Menyesuaikan antara nol dan waktu tanpa batas, sebanyak mungkin, memberikan kembali sesuai kebutuhan ( serakah)
- $menegaskan posisi di akhir baris

KV88
sumber
0

jika Anda ingin memeriksa file csv kosong atau tidak ....... coba ini

with open('file.csv','a',newline='') as f:
        csv_writer=DictWriter(f,fieldnames=['user_name','user_age','user_email','user_gender','user_type','user_check'])
        if os.stat('file.csv').st_size > 0:
            pass
        else:
            csv_writer.writeheader()
Rajan Singh
sumber
1
Selamat datang di Stack overflow. Harap tingkatkan jawaban Anda dengan membaca cara menulis jawaban yang baik .
Naresh Kumar