レコードリストにないプレーヤー名をここに入力すると、キーエラー例外が発生します。検索して有効な名前を取得することはできますが、他に何かを入力すると、キーエラーが発生します。ファイルの解析から作成された3セットのデータのようなものをすでに処理しているので、これを処理する方法がよくわかりません。
私はこのコードが悪いことを知っています。私はPythonを初めて使用するので、ごちゃごちゃしてください。これは、この機能を動作させるための一種のテストファイルであり、実際のメインファイルの関数に書き込みます。それが理にかなっているなら、ここの一種のテストベッド。
これが私のデータファイルに含まstats4.txt
れているものです。
[00000] Cho'Gath - 12/16/3 - Loss - 2012-11-22
[00001] Fizz - 12/5/16 - Win - 2012-11-22
[00002] Caitlyn - 13/4/6 - Win - 2012-11-22
[00003] Sona - 4/5/9 - Loss - 2012-11-23
[00004] Sona - 2/1/20 - Win - 2012-11-23
[00005] Sona - 6/3/17 - Loss - 2012-11-23
[00006] Caitlyn - 14/2/16 - Win - 2012-11-24
[00007] Lux - 10/2/14 - Win - 2012-11-24
[00008] Sona - 8/1/22 - Win - 2012-11-27
これが私のコードです:
import re
info = {}
records = []
search = []
with open('stats4.txt') as data:
for line in data:
gameid = [item.strip('[') for item in line.split(']')]
del gameid[-1]
gameidstr = ''.join(gameid)
gameid = gameidstr
line = line[7:]
player, stats, outcome, date = [item.strip() for item in line.split('-', 3)]
stats = dict(zip(('kills', 'deaths', 'assists'), map(int, stats.split('/'))))
date = tuple(map(int, date.split('-')))
info[player] = dict(zip(('gameid', 'player', 'stats', 'outcome', 'date'), (gameid, player, stats, outcome, date)))
records.append(tuple((gameid, info[player])))
print "\n\n", info, "\n\n" #print the info dictionary just to see
champ = raw_input() #get champion name
#print info[champ].get('stats').get('kills'), "\n\n"
#print "[%s] %s - %s/%s/%s - %s-%s-%s" % (info[champ].get('gameid'), champ, info[champ].get('stats').get('kills'), info[champ].get('stats').get('deaths'), info[champ].get('stats').get('assists'), info[champ].get('date')[0], info[champ].get('date')[1], info[champ].get('date')[2])
#print "\n\n"
#print info[champ].values()
i = 0
for item in records: #this prints out all records
print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'], records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'], records[i][1]['outcome'], records[i][1]['date'][0], records[i][1]['date'][1], records[i][1]['date'][2])
i = i + 1
print "\n" + "*" * 50
i = 0
for item in records:
if champ in records[i][1]['player']:
search.append(records[i][1])
else:
pass
i = i + 1
s = 0
if not search:
print "no availble records" #how can I get this to print even if nothing is inputted in raw_input above for champ?
print "****"
for item in search:
print "\n[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (search[s]['gameid'], search[s]['player'], search[s]['stats']['kills'], search[s]['stats']['deaths'], search[s]['stats']['assists'], search[s]['outcome'], search[s]['date'][0], search[s]['date'][1], search[s]['date'][2])
s = s + 1
Tryを設定してみました。ある種のことを除いて、無効なプレイヤー名を入力したときに別の結果を得ることができませんでした。名前が存在するかどうかに関係なく、関数を設定して別のものを返すことができると思いますが、少し混乱していると思います。また、一致しない8つのレコードについては、実際には一致しないことに注意してください。ただし、それは私が望んでいる方法ではありません。基本的に、ループ内のレコードにたまたま存在しない有効な入力だけでなく、無効な入力名に対してもそのようなものを取得する必要があります。
このデータの有効な入力名は次のとおりです。Cho'Gath、Fizz、Caitlyn、Sona、またはLux-他のものはキーエラーを生成します。これを処理する必要があるため、エラーは発生せず、代わりに「レコードなし」のように出力されます。そのチャンピオンのために利用可能」(そしてそれを8回ではなく1回だけ印刷する)
助けてくれてありがとう!
[編集]私はついに投稿でこのコードを更新することができました(追加してくれてありがとうmartineau、何らかの理由でバックティックがコードをブロックするように機能しておらず、貼り付けたときに太字の通常のテキストとして表示されていました。とにかく、見てくださいif not search
、何も入力されていない場合でも、どうすればそれを印刷できますか?raw_inputでreturnキーを押すだけで、現在****
、検索チャンピオンを与えていなくても、すべてのレコードが印刷されます。