จะตรวจสอบว่าไฟล์ว่างเปล่าได้อย่างไร?


คำตอบ:


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

11
stat.ST_SIZEแทน 6
wRAR

2
ก็ไม่เป็นไรเช่นกัน แต่ฉันไม่ต้องการนำเข้าสถิติ มันสั้นและหวานพอและขนาดตำแหน่งในรายการที่ส่งคืนจะไม่เปลี่ยนแปลงตลอดเวลาเร็ว ๆ นี้
ghostdog74

61
@wRAR: os.stat ('file') st_size ดียิ่งกว่า
Daniel Stutzbach

2
โปรดทราบว่าประเภทไฟล์ใช้งานได้กับ json ด้วยเช่นกัน บางครั้ง json.load () สำหรับไฟล์ว่างไม่ทำงานและนี่เป็นวิธีที่ดีในการจัดการกับกรณีนี้
seokhoonlee

เกิดอะไรขึ้นถ้าไฟล์มีบรรทัดใหม่ / ว่างเปล่าเท่านั้น คำตอบที่ไม่ถูกต้อง!
lone_coder

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

8
เพื่อความปลอดภัยคุณอาจต้องจับOSErrorและคืนค่าเท็จ
kennytm

5
อะไรคือข้อแตกต่าง / ข้อได้เปรียบในการใช้ vs os.state ('file'). st_size?
Elijah Lynn

2
ดูเหมือนว่าทั้งสองจะเหมือนกันภายใต้ประทุน: stackoverflow.com/a/18962257/1397061
1 ''

ฉันสามารถใช้กับพา ธ โฟลเดอร์ได้หรือไม่ @Jon
alper

71

ทั้งสองgetsize()และstat()จะโยนข้อยกเว้นหากไฟล์ไม่มีอยู่ ฟังก์ชั่นนี้จะคืนค่าจริง / เท็จโดยไม่ทิ้ง (ง่ายกว่า แต่แข็งแกร่งน้อยกว่า):

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

gotcha สำคัญ: ไฟล์ว่างที่ถูกบีบอัดจะปรากฏเป็นไม่เป็นศูนย์เมื่อทดสอบด้วย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) ของไฟล์
โดยเฉพาะ: สำหรับ regex ของ: ^\s*$โดยรวมหมายถึงถ้าไฟล์มีเพียงบรรทัดว่างและ / หรือช่องว่าง
- ^ยืนยันตำแหน่งที่จุดเริ่มต้นของบรรทัด
- \sจับคู่อักขระช่องว่างใด ๆ (เท่ากับ [\ r \ n \ t \ f \ v])
- *ตัวนับ - จับคู่ระหว่างศูนย์และเวลาไม่ จำกัด เท่าที่เป็นไปได้ให้กลับมาเท่าที่จำเป็น ( โลภ)
- $ยืนยันตำแหน่งที่ส่วนท้ายของบรรทัด


0

หากคุณต้องการตรวจสอบไฟล์ csv ว่าว่างเปล่าหรือไม่ ....... ลองใช้ดู

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
ยินดีต้อนรับใน Stack ล้น กรุณาปรับปรุงคำตอบของคุณโดยการอ่านวิธีการเขียนคำตอบที่ดี
Naresh Kumar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.