python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分...
我正在為我的游戲創(chuàng)建一個高分表。它以下列格式將值附加到.txt文件:
5.234,0,0,5234
6.345,1,1,8345
1.649,0,1,2649
2.25,0,1,3250
...等等
我想讀取前10個得分(得分是每行的第4個值)并將其輸出到屏幕上。我嘗試使用此處的信息,但無法理解。輸出它們的最佳方法是什么?
我知道您可以使用拆分值
for line in f:
Array = line.split(',')
我很確定如果我將它們放在排序的2D數(shù)組或等效數(shù)組中,就可以管理輸出
解決方案
使用該csv模塊將更加容易。例如:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = list(reader)
現(xiàn)在,scores將是10個列表的列表,每個列表有4個值。
您可以根據(jù)需要執(zhí)行相同的操作split,但是必須確保正確理解所有詳細(xì)信息,例如將換行符從每一行的末尾剝離(在非平凡的CSV文件中,詳細(xì)信息會變得更加復(fù)雜) ):
with open('highscores.txt', 'rb') as f:
scores = [line.strip().split(',') for line in f]
現(xiàn)在,您可以對每個步驟使用單個理解或函數(shù)調(diào)用來一次轉(zhuǎn)換列出的一個步驟。這種“聲明式編程”,您只需要說說要對值做些什么,而不用編寫循環(huán)并交錯所有步驟,就可以使您的生活變得更加輕松。
如果只需要最后一列,則可以理解:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = [row[-1] for row in reader]
如果要將它們轉(zhuǎn)換為整數(shù):
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = (row[-1] for row in reader)
intscores = [int(score) for score in scores]
…盡管在這種情況下,將兩個步驟合并在一起很簡單:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = [int(row[-1]) for row in reader]
如果希望它們以相反的順序(從最高到最低)排序:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = (int(row[-1]) for row in reader)
topscores = sorted(scores, reverse=True)
如果您只想要前十名:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = (int(row[-1]) for row in reader)
topscores = sorted(scores, reverse=True)
top10 = topscores[:10]
通過使用heapq模塊,您可以使最后一步更有效,但更為復(fù)雜:
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
scores = (int(row[-1]) for row in reader)
top10 = heapq.nlargest(10, scores)
從對另一個答案的評論中,您實(shí)際上希望獲得每行中的所有四個值。因此,您不僅需要閱讀每一行的最后一列,還需要閱讀整行。另外,您可能想將第一列轉(zhuǎn)換為浮點(diǎn)數(shù),將其余列轉(zhuǎn)換為整數(shù),這比將函數(shù)映射到每一行中的所有列要復(fù)雜一些。同時,nlargest或sorted將按第一列進(jìn)行比較,但要與最后一列進(jìn)行比較,這意味著您需要提供鍵功能。盡管自己寫一點(diǎn)也不難,但itemgetter已經(jīng)可以滿足您的要求。
with open('highscores.txt', 'rb') as f:
reader = csv.reader(f)
def convert_row(row):
return [float(row[0])] + [int(value) for value in row[1:]]
scores = (convert_row(row) for row in reader)
top10 = heapq.nlargest(10, scores, key=operator.itemgetter(-1))
for record in top10:
print('time: {} | moves: {} | penalties: {} | score: {}'.format(*record))
此代碼的唯一問題是,列順序的知識有點(diǎn)隱式地散布在整個代碼中。如果您有字典列表而不是列表列表,則可以按名稱訪問值。并DictReader讓您做到這一點(diǎn):
with open('highscores.txt', 'rb') as f:
reader = csv.DictReader(f, fieldnames=('time', 'moves', 'penalties', 'score'))
def convert_row(row):
return {k: float(v) if k == 'time' else int(v) for k, v in row.items()}
scores = [convert_row(row) for row in reader]
top10 = heapq.nlargest(10, scores, key=operator.itemgetter('score'))
for record in top10:
print('time: {time} | moves: {moves} | penalties: {penalties} | score: {score}'
.format(**record))
format函數(shù)中不再有0、1,-1或隱式排序;現(xiàn)在,所有內(nèi)容都使用字段名稱-time,但不包括time,score等等。另一方面,代碼更加冗長,并且某些人發(fā)現(xiàn)dict理解比列表理解/生成器表達(dá)式更難讀,所以……這是一個問題品嘗這是否有所改善。
總結(jié)
以上是生活随笔為你收集整理的python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基督徒宝宝该如何取名
- 下一篇: ubuntu 16.10安装mysql_