繁体   English   中英

如何从文件中打印特定行

[英]How to print a specific line from a file

我正在尝试从“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

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

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

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

我身边的几美分:

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

你会使用这种方式with将自行关闭文件或者程序结束或垃圾收集踢的时候,这样Python会逐行读取文件中的行和存储仅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

看看它是否适合你。

类似的事情: 只读取特定的行(Python)

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

fp.close()

我还注意到你不会为每个决定关闭你的文件,应该做到这一点。

很少有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:中的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外的player_name规范化为更快一点。 循环内部的下套管可以工作,但会重复执行相同的任务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM