python - 直接搜索文件和搜索使用“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()
形成了行列表。
推荐阅读
- java - 如何从 MessageReactionAddEvent 获取消息
- javascript - 在javascript中替换所有包含转义字符的字符串
- java - 使用来自 arrylist 的搜索结果加载多个条目
- android - 通过单击项目的按钮更新 RecyclerView 项目
- gremlin - 如何遍历所有顶点并获取嵌套对象
- sql - 过滤掉重复但在一行中显示来自另一列的非重复行
- python - 无法从 RPyC 函数返回的字典列表创建数据框
- php - 为什么对等证书 CN 与 CN='35.246.68.234' 不匹配?
- java - 如何使用比较器对数组中的某些特定元素进行排序
- java - 如何在 Android 上使用 scala jar?