我正在翻译器中完成这一切..
loc1 = '/council/council1'
file1 = open(loc1, 'r')
此时我可以执行 file1.read() 并将文件的内容作为字符串打印到标准输出
但是如果我添加这个..
string1 = file1.read()
字符串 1 返回空..我不知道我可能做错了什么。这似乎是最基本的事情!
如果我继续输入 file1.read() ,标准输出的输出只是一个空字符串。所以,当我尝试使用 file1.read() 创建字符串时,不知何故我丢失了文件
一个文件只能读取一次。之后,当前读取位置位于文件末尾。
如果您在重新阅读之前添加
file1.seek(0)
,您应该能够再次阅读内容。然而,更好的方法是第一次读入字符串,然后将其保留在内存中:
loc1 = '/council/council1'
file1 = open(loc1, 'r')
string1 = file1.read()
print string1
你不会丢失它,你只需将偏移指针移动到文件末尾并尝试读取更多数据。由于它是文件的末尾,因此没有更多数据可用,并且您会得到空字符串。尝试重新打开文件或寻求零位置:
f.read()
f.seek(0)
f.read()
使用
with
是最好的语法,因为它会在使用后关闭与文件的连接(自 python 2.5 起):
with open('/council/council1', 'r') as input_file:
text = input_file.read()
print(text)
引用官方关于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
)的一个优点是整个文件不会立即读入内存。
对于每个遇到同样问题的人来说,我的问题是我在 VS Code 的监视列表中添加了
file. read()
,令我感到困惑的是,它确实影响了调试代码的工作流程(在此之前,我认为监视列表上的所有内容都很好)虚拟的和/或独立于主工作流程。)
正如其他人和官方文档中提到的,在
file.read()
之后,偏移指针移动到文件末尾,因此后续调用将返回一个空字符串。即使从调试监视列表中调用,该行为仍然有效。
我的解决方案是删除该手表,然后一切正常。
确保您的位置正确。你的根目录 (
/council
) 下真的有一个名为 /
的目录吗?还可以使用 os.path.join()
创建您的路径
loc1 = os.path.join("/path","dir1","dir2")