Python 第二次尝试读取打开的文件时未获取任何数据
在上面的代码中,当在函数外部调用Python 第二次尝试读取打开的文件时未获取任何数据,python,Python,在上面的代码中,当在函数外部调用print lst()时,它会给出正确的结果,但当尝试在函数foo()中调用相同的函数时,它会生成空列表,使len(lst())值为0。我也试着注释最后两行,但它仍然返回空列表。上面的代码有什么错误?文件对象应该被读取一次。一旦fin被read(),您就不能再从文件中读取任何其他内容,因为它已经达到EOF 要读取文件的内容,请调用f.read(size),它读取一些 数据量,并将其作为字符串返回。尺寸是可选的 数字参数。当忽略大小或为负数时,整个 将读取并返回文件
print lst()
时,它会给出正确的结果,但当尝试在函数foo()
中调用相同的函数时,它会生成空列表,使len(lst())
值为0。我也试着注释最后两行,但它仍然返回空列表。上面的代码有什么错误?文件对象应该被读取一次。一旦fin
被read()
,您就不能再从文件中读取任何其他内容,因为它已经达到EOF
要读取文件的内容,请调用f.read(size),它读取一些
数据量,并将其作为字符串返回。尺寸是可选的
数字参数。当忽略大小或为负数时,整个
将读取并返回文件的内容;这是你的问题,如果
该文件是计算机内存的两倍大。否则,在
读取并返回大多数大小字节。如果文件的结尾已被删除
到达时,f.read()将返回一个空字符串(“”)
如果确实需要对文件进行可重入访问,请使用:
fin = open('/abc/xyz/test.txt', 'a+')
def lst():
return fin.read().splitlines()
print lst()
def foo(in):
print lst()
fin.write(str(len(lst()) + in)
fin.flush()
一旦你调用了一次fin
如果您想read()
再次读取它(在第一次尝试时就放弃了内容),则需要重新读取文件的开头
我建议您在lst()
中执行此操作,或者更好地存储lst()返回的内容
除此之外
def lst():
fin.seek(0)
return fin.readlines()
现在还不清楚您想在这里做什么,但最好使用lst()
中存储的返回值,而不要在中使用作为变量名,因为它是保留的
比如:
fin.write(str(len(lst()) + in)
将完整文件读入内存后,再从该文件中读取一些将导致返回空字符串:
lines = lst()
# [...]
number_of_lines = len(lines)
fin.write(str(number_of_lines) + some_other_str)
换句话说,您已经到达了文件的末尾。这里有三种选择:
为每次完整读取重新打开文件
用于再次转到文件的开头:
>>> example = open('foobar.txt')
>>> example.read()
'Foo Bar\n'
>>> example.read()
''
将文件内容存储在变量中,从而将其缓存在内存中,然后使用该变量而不是重新读取文件
File对象只能读取一次,这意味着如果在后面的fin.read()之前调用了fin.read()
,则该fin.read()将不返回任何内容
通过调用fin.read()后调用fin.seek(0)
,或将文件读取到某个缓冲区来修复此问题。为什么要打开ingfin
外部lst()
?在foo()中尝试第一个lst()调用时,您是否注释掉了第一个lst()调用?@olovb否。我放它只是为了检查lst()正在返回预期值。请注意,您应该尝试使用以在Python中打开文件。它更具可读性,并确保您的文件被关闭,即使引发异常。@Lattyware请用代码解释,例如:我认为fin.flush
将存储在I/O缓冲区中的更改写入文件。我之所以使用它,是因为我不知道如何使用file.close()
函数。如果我使用fin.flush()
更新“fin”,那么bar=fin.read()
会发生什么?它也会更新吗?@Alinwndrld:不会的。试试看!
>>> example = open('foobar.txt')
>>> example.read()
'Foo Bar\n'
>>> example.seek(0)
>>> example.read()
'Foo Bar\n'