如何从文件中打印特定行

时间:2016-04-18 17:27:58

标签: python file python-3.x if-statement

我正在尝试打印文件" Scores"中的特定行,这是选项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

6 个答案:

答案 0 :(得分:3)

find()方法如果成功则返回正索引,否则返回-1

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

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

答案 1 :(得分:3)

我身边的几美分:

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

file.close()

希望它有效!

答案 2 :(得分:2)

一种更安全的方式来读取文件和查找数据,这样在将整个文件存储到内存时就不会出现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

这样你将使用with,当程序结束或垃圾收集开始时,它将自动关闭文件。这样python将逐行读取文件并在内存中只存储1行。所以你可以使用大文件而不用担心内存问题。

希望有所帮助:)

答案 3 :(得分:1)

使用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

看看它是否适合你。

答案 4 :(得分:1)

这里有类似的事情: Reading specific lines only (Python)

fp = open("file")
for i, line in enumerate(fp):
    if line == playername:
        print line

fp.close()

我还注意到,如果发生这种情况,你不会为每个决定关闭文件。

答案 5 :(得分:1)

很少有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.close(),安全 如果有问题需要阅读文件。

for line in f:显示,在文本模式下迭代文件打开,我们每次迭代得到一行。

我们用播放器打印线后

break将有效地停止迭代线假设, 只有一条这样的线或者我们对第一条线感到满意。如果不是这样, 删除break可以打印包含播放器名称的所有行。

当从文本文件迭代器返回的行包含新行时,您可能更愿意删除它们。使用 print line.strip()在这种情况下会删除行的开头和结尾的所有空白字符。

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

可能会发生这样的情况:您没有获得名称的输出,该输出似乎存在于文件中。在这样的 如果您需要澄清信件案件。例如,如果您的文本文件包含所有名称 在确切的套管中,你必须正确输入名称。

其他选项是小写player_name并将其与较低的套线进行比较:

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_name规范化为更快一点。内壳下部 循环可以工作,但会重复执行相同的任务。

使用文件中的精确字母大小写打印行。