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)
    ,或将文件读取到某个缓冲区来修复此问题。

    为什么要
    打开
    ing
    fin
    外部
    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'