2015-05-26 2 views
0

Я пишу код для создания общего списка игроков из набора описаний. Имейте один файл CSV с описаниями каждой игры NFL в прошлом году, например «44-J.STARKS RIGHT GUARD TO GB 41 FOR 2 YARDS (31-K.CHANCELLOR, 50-K.WRIGHT)». или «3-R.WILSON PASS SHORT RIGHT TO 11-P.HARVIN RAN OB НА МОРЕ 29 НА 9 ЯРД». У меня также есть обновляющий список бега назад (и в будущем, другие позиции), который я добавляю вручную, если игрок появляется в режиме воспроизведения, но уже не входит в список бегущих назад. мой код выглядит как-Поиск двух файлов csv для сопоставления переменных с использованием Python

rbs=open('rbs.csv', 'rb+a') #open the running back file 
with open('/Users/masongardner/Desktop/pbp-2014.csv', 'rb') as csvfile: #opens the list of descriptions 
    reader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    reader.next() #skip the title row 
    for row in reader: 
     desc=row[14] #corresponds with the description of each play 
     #print desc 
     for line in rbs: #each line should be another running back in the running backs CSV 
       if re.findall(line[0], desc, re.I): 
        print 'found' 
        print line 
        print desc 
       elif re.findall('no play| KICKS | KNEEL | KNEELS | PUNT | PUNTS | Extra point |Field goal|Two-minute|END GAME|timeout|end of quarter|end quarter|no huddle', desc, re.I): 
        pass 
       elif re.findall('right guard|right end|right tackle|left guard|left tackle|left end|up the middle', desc,re.I): 
        print "did not find it" 
        print desc 
        rback=raw_input('running back:') 
        with open('rbs.csv','a') as rbfile: 
         rbwriter=csv.writer(rbfile, delimiter=' ', quotechar='|',quoting=csv.QUOTE_MINIMAL) 
         rbwriter.writerow([rback]) 
       else: 
        print "did not find it" 
        print desc 
    rbs.close() 

Как я только начинал с этим, я поставил один вход для файла "РБС как Eddy Лейси, который должен быть найден. Дело в том, что когда я запускаю свой код, я не получаю никакого вывода. Я возвращаю только статус выхода 0.

Я не понимаю, почему это так, поскольку есть тысячи строк, которые должны дать мне НЕКОТОРЫЕ выходные данные. Может кто-то, пожалуйста, помогите мне в том, что не так в моем процессе?

Сложение: Как она стоит на данный момент, мой файл rbs.csv отформатирован, как, например, когда я открываю его с TextEdit

27-E.LACY

24-F.GORE

и т. Д.

И когда я просматриваю одну из строк для описания игры, файл отформатирован как таковой: 2014090400,2014-09-04,1,13,32, GB, SEA, 1,10, 39,, 0,, ​​0, "(13:32) (НЕТ HUDDLE) 44-J. STARKS ПРАВИЛЬНО ОГРАНИЧИВАЕТСЯ к GB 41 ДЛЯ 2 ЯРД (31-K.CHANCELLOR, 50-KWRIGHT). ", 0 ,,, 2014,2," NO HUDDLE ", RUSH, 1,0,0,0, 0,0,0 ,, 0,0,0,0,0,0, "RIGHT GUARD", 39, СВОЯ, 0,, ​​0,, ​​0

+0

Вы должны дать реальный отрывок из одного из файлов CSV, но для меня это выглядит так, что ваш кавычек, вероятно, является '' '(двойная кавычка), а не' ''. То, что ваш разделительный символ невозможно сказать без реальная часть файла. Als распечатывают вашу строку, поэтому вы видите, что на самом деле вы наступаете на линии, как вы ожидаете. – Anthon

+0

Когда я запускаю команду печати, код действительно печатает весь документ описания. Если я печатаю переменную 'line' также во вложенном цикле, строки печатаются один раз для первой строки rbs ', но не для любой из следующих строк –

+0

, что я хочу сказать, код проходит через каждый строка, но только запуск элементов после «для строки в rbs» для первой строки –

ответ

1

часть for line in rbs проходит только через строки файла раз, и на начало есть только одна строка (хотя могут быть линии добавлены, когда второй elif найден.

Если вы хотите перебрать все строки, вам нужно переместить открытие этого файла в цикле for. И нет необходимости открывать его +a.

with open('/Users/masongardner/Desktop/pbp-2014.csv', 'rb') as csvfile: #opens the list of descriptions 
    reader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    reader.next() #skip the title row 
    for row in reader: 
     desc=row[14] #corresponds with the description of each play 
     #print desc 
     with open('rbs.csv', 'rb') as rbs: #open the running back file 
      for line in rbs: #each line should be another running back in the running backs CSV 
       if re.findall(line[0], desc, re.I): 
        print 'found' 
        print line 
        print desc 
       elif re.findall('no play| KICKS | KNEEL | KNEELS | PUNT | PUNTS | Extra point |Field goal|Two-minute|END GAME|timeout|end of quarter|end quarter|no huddle', desc, re.I): 
        pass 
       elif re.findall('right guard|right end|right tackle|left guard|left tackle|left end|up the middle', desc,re.I): 
        print "did not find it" 
        print desc 
        rback=raw_input('running back:') 
        with open('rbs.csv','a') as rbfile: 
         rbwriter=csv.writer(rbfile, delimiter=' ', quotechar='|',quoting=csv.QUOTE_MINIMAL) 
         rbwriter.writerow([rback]) 
       else: 
        print "did not find it" 
        print desc 

В качестве альтернативы вы можете открыть файл, как вы делаете, и стремиться к началу файла перед for line in rbs:.

Это не очень эффективно, поэтому, если вы не ожидаете, что содержимое rbs.csv не поместится в память, я бы собрал эту информацию в списке в памяти и перевернул ее для проверки. И только выпишите список в конце.

Другая оптимизация, на которую вы должны обратить внимание, - это то, что вы работаете, используя re.compile(), чтобы скомпилировать шаблоны, которые вы используете один раз, и повторно использовать их. Это должно ускорить findall.

Также ваш персонаж кавычек выглядит " вместо |, и я не уверен, почему вы его устанавливаете, как и вы, и почему это сработает.

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