Bagaimana cara memeriksa apakah suatu file kosong atau tidak?


Jawaban:


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

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


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

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

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

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

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

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.


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


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()

1
Selamat datang di Stack overflow. Harap tingkatkan jawaban Anda dengan membaca cara menulis jawaban yang baik .
Naresh Kumar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.