Làm thế nào để kiểm tra xem một tập tin có trống hay không?


Câu trả lời:


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

11
stat.ST_SIZEthay vì 6
wRAR

2
điều đó cũng tốt nhưng tôi không muốn nhập stat. Nó đủ ngắn và ngọt ngào và vị trí kích thước trong danh sách trả về sẽ không thay đổi sớm.
ghostdog74

61
@wRAR: os.stat ('file'). st_size thậm chí còn tốt hơn
Daniel Stutzbach

2
Lưu ý rằng các loại tệp cũng hoạt động cho json. Đôi khi, json.load () cho tệp trống không hoạt động và điều này cung cấp một cách tốt để xử lý trường hợp đó
seokhoonlee

Nếu tệp chỉ chứa dòng mới / trống thì sao? câu trả lời sai!
Abdullah cho biết

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

8
Để an toàn, bạn có thể cần phải bắt OSErrorvà trả lại Sai.
kennytm

5
Sự khác biệt / lợi thế khi sử dụng so với os.state ('file'). St_size là gì?
Elijah Lynn

2
Có vẻ như cả hai giống nhau dưới mui xe: stackoverflow.com/a/18962257/1397061
1 ''

Tôi có thể áp dụng nó cho đường dẫn thư mục không?
@Jon

71

Cả hai getsize()stat()sẽ ném một ngoại lệ nếu tập tin không tồn tại. Hàm này sẽ trả về Đúng / Sai mà không cần ném (đơn giản hơn nhưng kém mạnh mẽ hơn):

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

Chắc chắn là thích sử dụngos.path.getsize()
David Gay

9
Có một điều kiện cuộc đua bởi vì tập tin có thể được loại bỏ giữa các cuộc gọi đến os.path.isfile(fpath)os.path.getsize(fpath), trong trường hợp đó, chức năng được đề xuất sẽ đưa ra một ngoại lệ.
s3rvac

3
Tốt hơn để thử và nắm bắt OSErrorthay vào đó, như đề xuất trong một bình luận khác .
j08

Cũng cần phải bắt TypeErrorđược sẽ được nâng lên trong trường hợp đường dẫn đầu vào là None.
Trutane

25

nếu vì lý do nào đó bạn đã mở tệp, bạn có thể thử điều này:

>>> 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 vì vậy tôi sẽ kết hợp câu trả lời của ghostdog74 và các bình luận, chỉ để cho vui.

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

False có nghĩa là một tập tin không trống.

Vì vậy, hãy viết một hàm:

import os

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

8

Nếu bạn đang sử dụng Python3, pathlibbạn có thể truy cập os.stat()thông tin bằng Path.stat()phương thức có thuộc tính st_size(kích thước tệp theo byte):

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

4

nếu bạn có đối tượng tập tin, thì

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

Câu trả lời này nên có nhiều phiếu hơn vì nó thực sự kiểm tra xem tệp có bất kỳ nội dung nào không.
amanb

1

Một gotcha quan trọng: một tệp trống được nén sẽ xuất hiện khác không khi được kiểm tra với getsize()hoặc các stat()hàm:

$ 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

Vì vậy, bạn nên kiểm tra xem tệp cần kiểm tra có bị nén hay không (ví dụ: kiểm tra hậu tố tên tệp) và nếu vậy, hãy bảo lãnh hoặc giải nén nó đến một vị trí tạm thời, kiểm tra tệp không nén, sau đó xóa tệp khi hoàn tất.


1

Vì bạn chưa định nghĩa tập tin trống là gì. Một số có thể coi một tệp chỉ có các dòng trống cũng là một tệp trống. Vì vậy, nếu bạn muốn kiểm tra xem tệp của bạn chỉ chứa các dòng trống (bất kỳ ký tự khoảng trắng nào, '\ r', '\ n', '\ t') , bạn có thể làm theo ví dụ dưới đây:

Python3

import re

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

Giải thích: ví dụ trên sử dụng biểu thức chính quy (regex) để khớp với nội dung ( content) của tệp.
Cụ thể: đối với regex của: ^\s*$như toàn bộ phương tiện nếu tệp chỉ chứa các dòng trống và / hoặc khoảng trắng.
- ^khẳng định vị trí khi bắt đầu một dòng
- \skhớp với bất kỳ ký tự khoảng trắng nào (bằng [\ r \ n \ t \ f \ v])
- Bộ *định lượng - Ghép giữa số 0 và số lần không giới hạn, nhiều lần nhất có thể, trả lại khi cần ( tham lam)
- $khẳng định vị trí ở cuối dòng


0

nếu bạn muốn kiểm tra tập tin csv có trống hay không ....... hãy thử điều này

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
Chào mừng bạn trong tràn Stack. Vui lòng cải thiện câu trả lời của bạn bằng cách đọc làm thế nào để viết một câu trả lời tốt .
Naresh Kumar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.