直接搜索文件和搜索使用 "read()" 函数获得的字符串有什么区别



我使用以下代码成功搜索了一个文件:

fhand = open('mbox-short.txt')
for line in fhand:
if fhand.startswith("From"):
print(line)

但是,如果我尝试将文件读取到字符串(inp(中并执行相同的搜索,则不会得到任何输出:

fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp:
if inp.startswith('From:'):
print(line)

我想知道为什么我不能查询我的inp字符串。请假设文件大小不太大。如果我可以使用len()查询inp,为什么不能使用startswith()

这是因为for循环实际上是从文件中读取行:

fhand = open('mbox-short.txt')
for line in fhand:
if line.startswith('From:'):
print(line)

这里,fhand是一个文件句柄,当您对它进行迭代时,我们可以访问文件中的每一行。这里,line是一个字符串,有一个.startswith的方法,我们可以用它来检查它是否以某个特定短语开头。

这不起作用:

fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp:                  # wrong this is char by char - not lines
if inp.startswith('From:'):   # wrong since inp is the whole string
print(line)

fhand.read()返回文件中的整个文本块,当您对其进行迭代时,它会返回文本块中的每个字符。如果您使用startswith('From:'),这将永远不会是真的,因为它只比较单个字符。

你可以这样"修复"第二个:

fhand = open('mbox-short.txt')
inp = fhand.read()
for line in inp.splitlines():
if line.startswith('From:'):   
print(line)

现在您将在字符串的行上循环,而不是在字符上循环,因为.splitlines()形成了一个行列表。

最新更新