尝试再次读取打开的文件不会获得任何数据

时间:2012-05-27 09:29:49

标签: python

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()

在上面的代码中,当print lst()在函数外部调用时,它会给出正确的结果,但是当尝试在函数foo()中调用相同的函数时,它会生成空列表,使len(lst())值为0.也尝试通过评论最后两行,但它仍然给出了空列表。上面的代码有什么问题?

4 个答案:

答案 0 :(得分:7)

文件对象应该被读取一次。 finread()后,您无法再从文件中读取任何内容,因为该文件已达到EOF

  

要读取文件的内容,请调用f.read(size),其中包含一些内容   数据量并将其作为字符串返回。尺寸是可选的   数字参数。当大小被省略或为负时,整个   将读取并返回该文件的内容;这是你的问题   该文件是机器内存的两倍。否则,在   读取并返回大多数大小的字节。如果文件的结尾已经存在   到达时,f.read()将返回一个空字符串(“”)。

http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

如果您确实需要重新访问您的文件,请使用:

def lst():
  fin.seek(0)
  return fin.readlines()

答案 1 :(得分:4)

将完整文件读入内存后,从该文件中读取更多文件将导致返回空字符串:

>>> example = open('foobar.txt')
>>> example.read()
'Foo Bar\n'
>>> example.read()
''

换句话说,您已到达文件的末尾。你有三种选择:

  1. 为每次完整阅读重新打开文件。
  2. 使用.seek()再次转到文件的开头:

    >>> example = open('foobar.txt')
    >>> example.read()
    'Foo Bar\n'
    >>> example.seek(0)
    >>> example.read()
    'Foo Bar\n'
    
  3. 将文件的内容存储在变量中,然后将其缓存在内存中,然后使用它而不是重新读取文件。

答案 2 :(得分:3)

一旦您阅读了fin,就致电read()

如果您想再次read()它(在第一次尝试时丢弃了内容),则需要重新open()seek()文件的开头。

我建议您在lst()中执行此操作,或者更好的是,存储lst()

返回的内容

除此之外......

fin.write(str(len(lst()) + in)

目前还不清楚你在这里尝试做什么,但最好还是使用lst()的存储返回值,而不是使用in作为变量名,因为它是保留的keyword

类似的东西:

lines = lst()
# [...]
number_of_lines = len(lines)
fin.write(str(number_of_lines) + some_other_str)

答案 3 :(得分:1)

文件对象只能只读一次,这意味着如果你在之后的fin.read()之前调用fin.read()将不返回任何内容。

在调用fin.read()之后通过调用fin.seek(0)来解决此问题,或将文件读取到某个缓冲区。