Hoe te controleren of een bestand leeg is of niet

Ik heb een tekstbestand. Hoe kan ik controleren of het leeg is of niet?


Antwoord 1, autoriteit 100%

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

Antwoord 2, autoriteit 32%

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

Antwoord 3, autoriteit 19%

Zowel getsize()als stat()zullen een uitzondering genereren als het bestand niet bestaat. Deze functie retourneert True/Fals zonder te gooien (eenvoudiger maar minder robuust):

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

Antwoord 4, autoriteit 8%

Als je het bestand om de een of andere reden al open had staan, kun je dit proberen:

>>> 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" # The first character is the empty string..
...     else:
...         my_file.seek(0) # The first character wasn't empty. Return to the start of the file.
...         # Use file now
...
file is empty

Antwoord 5, autoriteit 6%

Als je Python 3 gebruikt met pathlib, heb je toegang tot os.stat()informatie met behulp van de Path.stat()methode, die het attribuut st_sizeheeft (bestandsgrootte in bytes):

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

Antwoord 6, autoriteit 2%

als je het bestandsobject hebt, dan

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

Antwoord 7, autoriteit 2%

Een combinatie van antwoord van ghostdog74en de opmerkingen:

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

Falsebetekent een niet-leeg bestand.

Dus laten we een functie schrijven:

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

Antwoord 8

Omdat je niet hebt gedefinieerd wat een leeg bestand is: Sommigen beschouwen een bestand met alleen lege regels misschien ook als een leeg bestand. Dus als je wilt controleren of je bestand alleen lege regels bevat (elk witruimteteken, ‘\r’, ‘\n’, ‘\t’), kun je het onderstaande voorbeeld volgen:

Python 3

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

Uitleg: in het bovenstaande voorbeeld wordt een reguliere expressie (regex) gebruikt die overeenkomt met de inhoud (content) van het bestand.

Specifiek: voor een regex van: ^\s*$betekent als geheel of het bestand alleen lege regels en/of spaties bevat.

  • ^bevestigt positie aan het begin van een regel
  • \skomt overeen met elk witruimteteken (gelijk aan [\r\n\t\f\v ])
  • *Quantifier — Komt overeen tussen nul en onbeperkte tijden, zo vaak mogelijk, teruggeven als nodig is (hebzuchtig)
  • $bevestigt positie aan het einde van een regel

Antwoord 9

Een belangrijk probleem: een gecomprimeerd leeg bestandlijkt niet-nul te zijn wanneer het wordt getest met de functies getsize()of 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

Je moet dus controleren of het te testen bestand is gecomprimeerd (bekijk bijvoorbeeld het achtervoegsel van de bestandsnaam) en zo ja, bewaar het of decomprimeer het naar een tijdelijke locatie, test het niet-gecomprimeerde bestand en verwijder het als je klaar bent.

p>


Antwoord 10

Als u wilt controleren of een CSV-bestand leeg is of
niet, probeer dit:

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

Other episodes