我正在尝试打印文件" 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
答案 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)
fp = open("file")
for i, line in enumerate(fp):
if line == playername:
print line
fp.close()
我还注意到,如果发生这种情况,你不会为每个决定关闭文件。
答案 5 :(得分:1)
这里有很多答案,我的示例带来了一些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
规范化为更快一点。内壳下部
循环可以工作,但会重复执行相同的任务。
使用文件中的精确字母大小写打印行。