使用输入重定向读取文件前如何检查文件是否为空?
问题
我想要检查文件是否为空,读取文件的方式是:
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
相关产品推荐
相关产品推荐

