Python 如何在不使用with open的情况下检查文件是否为空?
我正在尝试读取目录中的文本文件。但是,在执行任何操作之前,我希望确保它不是空的。若文本文件为空,我需要再次创建该空文件(即在当前目录中),若不是,我需要对文本文件的每一行执行一些计算,并创建具有相同名称的相应文件。简而言之,我需要创建引用目录(Python 如何在不使用with open的情况下检查文件是否为空?,python,python-3.x,io,Python,Python 3.x,Io,我正在尝试读取目录中的文本文件。但是,在执行任何操作之前,我希望确保它不是空的。若文本文件为空,我需要再次创建该空文件(即在当前目录中),若不是,我需要对文本文件的每一行执行一些计算,并创建具有相同名称的相应文件。简而言之,我需要创建引用目录(path\u In)中的文件数量 所以为了检查文本文件是否为空,我想我应该先打开它。我用open打开它,它的句柄是filename\u handle。我检查了它是否为空,但在这里它引发了TypeError:参数应该是字符串、字节或整数,而不是_io.Tex
path\u In
)中的文件数量
所以为了检查文本文件是否为空,我想我应该先打开它。我用open
打开它,它的句柄是filename\u handle
。我检查了它是否为空,但在这里它引发了TypeError:参数应该是字符串、字节或整数,而不是_io.TextIOWrapper
。我知道发生此错误的原因(因为filename\u handle
是object),但我不知道如何检查文件是否为空
有人能帮我解决这个问题吗
这是我的密码
import numpy as np
import cv2, os
from glob import glob
path_in = 'C:\\Users\\user\\Desktop\\labels'
for filename in os.listdir(path_in):
filename_edited = []
with open(path_in + '\\' +filename) as filename_handle:
if os.stat(filename_handle).st_size == 0:
filename_edited.append(filename_handle)
else:
for line in filename_handle:
numericdata = line.split(' ')
numbers = []
for i in numericdata:
numbers.append(int(i))
c,x,y = numbers
edited = [c, y, (19-x)]
filename_edited.append(edited)
filename_edited_array = np.array(filename_edited)
with open(filename , 'wb') as f:
np.savetxt(f, filename_edited_array,fmt= '%.1i', delimiter=' ', newline='\n', header='', footer='', comments='# ')
continue
可以使用os.path.getsize()方法获取作为参数传递的文件的大小(以字节为单位)。如果文件为空,则其大小将为0字节。因此,您可以使用下面的代码来检查它:
import os
if os.path.getsize('path/to/file.txt') == 0: # If the file size is 0 bytes
# Implementation
。它不接受任意文件对象
因此,您需要:
os.stat(filename_handle.fileno()).st_size
从打开的文件中提取文件描述符,或:
os.stat(path_in + '\\' +filename).st_size
它按名称统计文件,需要一个打开的文件句柄。更确切地说,您应该真正使用
os.path.join
来构建路径,因此os.stat(os.path.join(path\u in,filename)).st\u size
将是按名称进行此操作时更干净的方法。@cᴏʟᴅsᴘᴇᴇᴅ 这不是我要问的,在这种情况下,它将文件读取为字符串并输出FileNotFoundError
我没有尝试@ShadowRanger,罗纳德·佩雷拉的回答足以完成这项工作。无论如何谢谢你!os.scandir()会更符合他的程序。@bitchaser:如果你能使用它,os.scandir
通常适用于每个程序;一般来说,它更快、更方便(如果没有其他功能的话,那么在不进行字符串操作的情况下轻松获取名称或限定路径就很简单了,并且允许您逐个文件地处理庞大的目录,而无需几分钟的文件延迟)。不过,我对推荐3.5+中只提供(内置)的东西持谨慎态度,特别是当它与主要问题相切时,因为“3.x”总是以一些过时的版本(如3.3或3.4)结束,而这些版本都缺少它。