You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用输入重定向读取文件前如何检查文件是否为空?

问题

我想要检查文件是否为空,读取文件的方式是:

python3 main.py < in.txt 

因此不想使用import os来检查系统中的文件。

我的脚本如下:

#File is not in yet
data=''#Reading file until "0 0 0 0" line appears

#Any posible way to check if file comes empty here?

while (data != "0 0 0 0"):
    data=input()
    print(data)
    elements=data.split() #to separate data when ' ' comes in
print("done")

当文件为空时,会收到错误:EOFError: EOF when reading a line

需求

在使用输入重定向读取文件时,是否有办法通过文件大小或条件判断data=input()的结果,来检测文件是否为空?
例如类似这样的写法:

if ((data=input())==NULL): | if ((data=input())==''):

解决方法

方法1:捕获EOFError判断空文件

空文件的本质是输入流一开始就到了末尾,第一次调用input()会直接触发EOFError。可以在脚本开头先尝试读取一行,捕获这个异常就说明文件为空:

data = ''
# 先检查文件是否为空
try:
    data = input()
except EOFError:
    print("文件为空")
    exit()

# 执行原有逻辑
while data != "0 0 0 0":
    print(data)
    elements = data.split()
    try:
        data = input()
    except EOFError:
        print("文件已读完,未找到结束标记")
        break
print("done")

方法2:一次性读取所有输入内容

用sys.stdin读取全部输入,先判断是否为空,再按行处理。这种方式无需处理异常,逻辑更直观,且没有操作系统文件,符合你的要求:

import sys

# 读取所有输入并按行分割
lines = sys.stdin.readlines()

if not lines:
    print("文件为空")
    exit()

data = ''
for line in lines:
    # 去掉换行符,和input()返回结果一致
    data = line.rstrip('\n')
    if data == "0 0 0 0":
        break
    print(data)
    elements = data.split()
print("done")

方法3:用 walrus 运算符实现类似你想要的判断(Python3.8+支持)

Python不支持直接在判断里赋值,但可以用 walrus 运算符实现近似逻辑,同时结合异常处理覆盖完全空的情况:

data = ''
try:
    # 读取第一行并判断是否为空
    if not (data := input().rstrip('\n')):
        print("文件内容为空")
        exit()
except EOFError:
    print("文件为空")
    exit()

# 继续原有循环逻辑
while data != "0 0 0 0":
    print(data)
    elements = data.split()
    try:
        data = input().rstrip('\n')
    except EOFError:
        print("文件已读完")
        break
print("done")

内容的提问来源于stack exchange,提问作者Eduardo Beitia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:52:38