f.read 为空

问题描述 投票:0回答:6

我正在翻译器中完成这一切..

loc1 = '/council/council1'
file1 = open(loc1, 'r')

此时我可以执行 file1.read() 并将文件的内容作为字符串打印到标准输出

但是如果我添加这个..

string1 = file1.read()

字符串 1 返回空..我不知道我可能做错了什么。这似乎是最基本的事情!

如果我继续输入 file1.read() ,标准输出的输出只是一个空字符串。所以,当我尝试使用 file1.read() 创建字符串时,不知何故我丢失了文件

python string file
6个回答
5
投票

一个文件只能读取一次。之后,当前读取位置位于文件末尾。

如果您在重新阅读之前添加

file1.seek(0)
,您应该能够再次阅读内容。然而,更好的方法是第一次读入字符串,然后将其保留在内存中:

loc1 = '/council/council1'
file1 = open(loc1, 'r')
string1 = file1.read()
print string1

3
投票

你不会丢失它,你只需将偏移指针移动到文件末尾并尝试读取更多数据。由于它是文件的末尾,因此没有更多数据可用,并且您会得到空字符串。尝试重新打开文件或寻求零位置:

f.read()
f.seek(0)
f.read()

0
投票

使用

with
是最好的语法,因为它会在使用后关闭与文件的连接(自 python 2.5 起):

with open('/council/council1', 'r') as input_file:
   text = input_file.read()
print(text)

0
投票

引用官方关于read()的文档

要读取文件的内容,请调用 f.read(size)

当 size 省略或为负数时,文件的全部内容将 被阅读并返回;

最相关的部分:

如果已到达文件末尾,f.read() 将返回一个空 字符串 ('')。

这意味着如果您连续使用

read()
两次,预计第二次您将得到一个空字符串。要么第一次存储它,要么使用
f.seek(0)
返回到开头。它们共同提供了较低级别的 API,为您提供更好的控制。

除了使用上下文管理器自动打开和关闭文件之外,还有另一种方法来读取整个文本文件,使用pathlib,示例如下:

#!/usr/bin/env python3

from pathlib import Path


txt_file = Path("myfile.txt")

try:
    content = txt_file.read_text()
except FileNotFoundError:
    print("Could not find file")
else:
    print(f"The content is: {content}")
    print(f"I can also read again: {txt_file.read_text()}")

如您所见,您可以多次调用

read_text()
,您将获得完整的内容,不会有任何意外。当然,您不想在生产代码中执行此操作,因为
read_text()
每次都会打开和关闭文件,但最好还是存储它。在处理文件和文件路径时,我强烈推荐
pathlib

这超出了范围,但逐行阅读时可能值得注意的是差异。与

open()
获取的文件对象不同,
PosixPath
返回的
Path()
是不可迭代的。相当于:

with open('file.txt') as f:
    for line in f:
        print(line)

会是这样的:

for line in Path('file.txt').read_text().split('\n'):
    print(line)

第一种方法(

open
)的一个优点是整个文件不会立即读入内存。


0
投票

对于每个遇到同样问题的人来说,我的问题是我在 VS Code 的监视列表中添加了

file. read()
,令我感到困惑的是,它确实影响了调试代码的工作流程(在此之前,我认为监视列表上的所有内容都很好)虚拟的和/或独立于主工作流程。)

正如其他人和官方文档中提到的,在

file.read()
之后,偏移指针移动到文件末尾,因此后续调用将返回一个空字符串。即使从调试监视列表中调用,该行为仍然有效。

我的解决方案是删除该手表,然后一切正常。


-1
投票

确保您的位置正确。你的根目录 (

/council
) 下真的有一个名为
/
的目录吗?还可以使用
os.path.join()
创建您的路径

loc1 = os.path.join("/path","dir1","dir2")
© www.soinside.com 2019 - 2024. All rights reserved.