Python 如何打印文件中的特定行

Python 如何打印文件中的特定行,python,file,python-3.x,if-statement,Python,File,Python 3.x,If Statement,我正在尝试打印文件“分数”中的特定行,即选项B。这是我的代码: print("Option A: Show all scores\nOption B: Show a record\nOption Q: Quit") decision = input("Enter A, B, C or Q: ") myFile = open("Scores.txt", "rt") if decision == "A": record = myFile.read() print(record)

我正在尝试打印文件“分数”中的特定行,即选项B。这是我的代码:

print("Option A: Show all scores\nOption B: Show a record\nOption Q: Quit")
decision = input("Enter A, B, C or Q: ")
myFile = open("Scores.txt", "rt")
if decision == "A":
    record = myFile.read()
    print(record)
    myFile.close()
elif decision == "B" or decision == "b":
    playerName = input("Enter a player name to view their scores: ")
    record = myFile.read()
    answer = record.find(playerName)
    for line in answer:
        print(line)
elif decision == "Q" or decision == "q":
    exit
我选择了选项B,然后输入了一个保存玩家分数的玩家名称,但它会抛出以下错误消息:

line 12, in <module>
for line in answer():
TypeError: 'int' object is not callable
第12行,在
对于答案()中的行:
TypeError:“int”对象不可调用
find()
方法如果成功,将返回一个正索引,否则返回-1

您应该逐行循环内容,如下所示:

for line in myFile:
    if line.find(playerName):
        print(line)

使用
str
方法需要更多技巧。试试下面的方法

import re
p = re.compile(r"\b{}\b".format(playername)) # keep it ready

# inside option B
for line in myfile:    # no need to `.read()` it
    match = p.search(line)
    if match:
        print(line)
        break   # if there is only one record for playername
看看它是否适合你。

这里有类似的东西:


我还注意到,您没有为每个决策关闭您的文件,应该这样做。

我这边几美分:

file = open("file")
lines = file.readlines()
for line in lines:
    if playername in line:
        print line

file.close()

希望它能起作用

一种更安全的读取文件和查找数据的方法,这样在将整个文件存储在内存中时就不会出现OutOfMemory问题

playerName = input("Enter a player name to view their scores: ")
with open("Scores.txt", 'r') as f:
    for row in f:
        if playerName in row:
            print row
这样,您将使用
,当程序结束或垃圾收集开始时,它将自动关闭文件。这样,python将逐行读取文件,并在内存中只存储一行。因此,您可以使用大型文件,而不必担心内存问题

希望有帮助:)

很少使用python习惯用法和小优化 以下是许多答案,我的示例引入了一些python习惯用法,并对其进行了一些优化:

fname = "Scores.txt"
player_name = "Quido"

with open(fname) as f:
    for line in f:
        if player_name in line:
            print line
            break
print "Going on doing following tasks."
退出内部块时,
with
块将关闭打开的文件。无需
f.关闭()
,安全 以防读取文件时出现问题

对于f中的行:
显示,在以文本模式打开的文件上迭代,我们每次迭代得到一行

break
在我们用播放器打印行之后,播放器将有效地停止对行的迭代, 只有一条这样的线,或者说我们对第一条线很满意。如果不是这样的话, 删除
break
可以打印包含玩家姓名的所有行

由于文本文件迭代器返回的行包含新行,所以您可能更愿意删除它们。使用
打印line.strip()
在这种情况下,什么将删除行首和行尾的所有空白字符

最终打印正在验证,程序在处理完所有行后继续

可能会出现这样的情况,即您没有获得文件中显示的名称的输出。以这样的方式 案例,您可能需要澄清信函案例。例如,如果文本文件包含所有名称 在确切的大小写中,您必须正确输入名称

另一个选项是将播放器名称小写,并将其与小写行进行比较:

fname = "Scores.txt"
player_name = "Quido"
normalized_player_name = player_name.lower()

with open(fname) as f:
    for line in f:
        if normalized_player_name in line.lower():
            print line.strip()
            break  # comment out to print all lines with the player
print "Going on doing following tasks."
注意,我们将
player\u name
从循环外部规范化,以加快速度。下壳体位于阀内 循环可以工作,但会重复执行相同的任务


该行使用与文件中完全相同的字母大小写打印。

read
retuns一个字符串。因此,您将迭代字符而不是行。更改为
record.split('\n')
这将使
的“foo”
的“foobar”
匹配,它将打印整个文件。。。我把for循环放在正确的地方了吗?我将答案中的
行替换为:
与您刚才提供的代码位我刚刚使用readlines()而不是read()编辑了我的答案,这可以解决问题使用字典将使您的查找量大增easier@PadraicCunningham在学校,我们还没有学会使用字典。但是谢谢你的建议!别担心,
elif decision==“Q”或“Q”:
也不会做你想的事。您需要
elif decision==“Q”或decision==“Q”:
或更简单的
elif decision.lower()==“Q”
顺便说一句,您的类型错误是由
answer()
引起的,因为答案不是一个function@PadraicCunningham哎呀,那是个错误。谢谢你!它结束了这场战争program@User0123456789你能详细解释一下吗?@C Panda我把你代码的前两行放在if和elif语句之外,并用回答中的
行替换了for循环:print(line)
。我保存了程序并运行了它,但当我搜索玩家名“Ben”时,它只是结束了程序。我做对了吗?
fname = "Scores.txt"
player_name = "Quido"
normalized_player_name = player_name.lower()

with open(fname) as f:
    for line in f:
        if normalized_player_name in line.lower():
            print line.strip()
            break  # comment out to print all lines with the player
print "Going on doing following tasks."