2015-04-28 4 views
0

У меня есть домашнее задание, и нам нужно пройти через файл, который мы создали, и взять игроков, которые сыграли более 50 игр, и средний процент съемки составляет более 50 процентов (что мы должны вычислить по разделив два числа).Чтение файла nba python

Я отформатировал свой код, как это, потому что я пытаюсь индексировать в новые строки, которые я создал из текста. Это не работает для меня, и мне было интересно, может ли кто-нибудь указать мне в новом направлении, пожалуйста. Спасибо.

f = open("stats-clean.txt", "r") 
lines = f.read() 
for line in lines: 
    new_lines = lines.split("\n") 
report = [] 
new_lines.remove(new_lines[0]) 
for item in new_lines: 
    if int(item[4])/int(item[5]) > .50 and int(item[3]) >= 50: 
     report.append(item) 
print(report) 
f.close() 
+0

Что не работает? – Tyler

+0

В чем ошибка, с которой вы столкнулись? Не могли бы вы вставить свой файл здесь? – letsc

+0

@letsc http://foureyes.github.io/csci-ua.0002-spring2015-008/homework/hw10/stats-clean.txt это ссылка, в которой есть вся информация, которую я сохранил в своем файле – nh919

ответ

1

Я не уверен относительно формата вашего ввода, но одна проблема заключается в том, что вы пытаетесь сравнить целые числа с плавающими. если вы кастовый элемент [4] и пункт [5] как ints, например.

int(item[4])/int(item[5]) > .50 

тогда разрешение подразделения выше всегда даст вам инт. Так что ...

int(4)/int(5) = 0 

Но

float(4)/float(5) = 0.8 

Так что вполне вероятно, что вы на самом деле не делаете сравнение, что вы хотели, что может привести к той части, если заявление разделяющего лжи ,

+0

Спасибо! @ gc123unc – nh919

1

Просто, чтобы вы знали, есть более простой способ сделать это, я просто написал это решение для удовольствия.

import csv 

with open('stats-clean.txt', 'rb') as f: 
    reader = csv.reader(f) 
    player_data = list(reader) 

for i in player_data[1:]: 
    name , pos, team, gp, fgm, fga = i 
    if gp > 50: 
     try: 
      print 'Player: {0} Average Shooting per game {1}'.format(name, (float(gp)/float(fga))) 
     except ZeroDivisionError as e: 
      print 'ZERO SHOTS : Player {} has {} shots'.format(name, fga) 
+0

спасибо! @letsc – nh919

+0

если @ GC123UNC ответил на ваш первоначальный вопрос, пожалуйста, примите его – letsc

0

Ключевой проблемой здесь является то, что new_lines список строк, например

>>> new_lines[0] 
'Julyan Stone,PG,DEN,4,0.5,0.5' 

item[4] этой строки является символ 'a' так, когда вы идете, чтобы бросить с int вы получите ValueError: invalid literal for int() with base 10: 'a'.

Вам необходимо разделить каждый элемент new_lines, используя split(','). Так, например

>>> new_lines[1].split(',') 
['Chris Wilcox', 'PF', 'BOS', '61', '1.8', '2.5'] 

Теперь вы можете сделать свой кастинг в item[4] является '1.8' и выполнить свой условный тест, но использовать floats вместо int, чтобы включить строки в число, как указывали @ GC123UNC

Также обратите внимание, что петля

for line in lines: 
    new_lines = lines.split("\n") 

излишни: lines является строка: один split('\n') дает список new_lines что вам нужно. Вам нужно пройти через элементы new_lines и разделить на ,, чтобы вы могли выполнить свой условный тест.

Вместо remove использование нарезки: newlines[1:].

Возможно, вы захотите рассмотреть использование lines = f.readlines(), а не lines = f.read(). Последний возвращает строку, которую нужно разбить, а затем снова разбить.Первый дает вам список, который вы можете strip() и разделить на , (что-то вроде line.strip().split(','))

Смежные вопросы