2013-06-28 1 views
1

Я понимаю, что этот код крайне неэффективен.Для разбора файла вызова функции цикла

У меня здесь полная потеря, и я планирую удалить эту функцию и просто сделать код процедурным в основном. Но я надеюсь, что кто-то сможет объяснить, что я здесь вижу. Цикл в main() запускается и вызывает matchName(). matchName() выполняет его цикл тогда, когда он должен вернуться для следующего «vtRow», вместо этого он просто прекращает выполнение. Таким образом, выход является первой записью vtData и каждой записи из adData.

import csv, re 

def main(): 
    #1st word 
    oneWord = re.compile('\A([\w]+)') 
    #1st 3 
    first3 = re.compile('\A([\w]{3})') 
    #last 3 
    last3 = re.compile('(?=([\w]{3})$)') 

    mArray = [ oneWord, first3, last3 ] 
    adFile = open('adData.csv', 'rb') 
    adFields = ('lName','fName','cNum','addy','city','state','zip','phone','sex') 
    adData = csv.reader(adFile, dialect='excel') 

    vtFile = open('data360.csv','rb') 
    vtFields = ('ref','fName','lName') 
    vtData = csv.reader(vtFile, dialect='excel') 

    for vtRow in vtData: 
     matchName(vtRow, adData, mArray) # appears that this runs once and exits 

def matchName(curVtRow, adData, mArr): 
    lName = curVtRow[4].lower() 
    fName = curVtRow[3].lower() 
    Posib = [] 

    for row in adData: 
     cName = row[0].lower() 
     print "vt " + lName + " ; ad " + cName 
    return 1 

if __name__ == "__main__": 
    main() 
+0

Какая линия останавливается? Не могли бы вы пометить его в коде? Показать ввод и вывод? – Marcin

+0

он выходит изящно в matchname (vtRow, adData, mArray) – Brian

ответ

2

Вопрос заключается в том, что цикл с adData причин adFile для чтения, и поэтому после первого вызова matchName() файл будет прочтенных весь путь и, таким образом, adData не будет накинут, как adData.next() вон» t приведет к чему-либо (и, следовательно, оператор print не будет выполнен). Я предлагаю разместить adFile.seek(0) по телефону matchName(). Обратите внимание, что просто воссоздание adData не будет работать; Недавно я обнаружил, что csv-ридер обновляет положение своего базового объекта, а не отслеживает его сам по себе.

+0

Спасибо! Мне нужно будет немного почитать в документах, но я очень ценю вашу помощь. – Brian

+0

Выполняет 'seek (0)' в базовом файле для чтения CSV-считывателя, который работает? После того, как считыватель CSV достигнет конца файла, я бы предпочел, чтобы он остановился навсегда –

+0

@SimonCallan Да, потому что 'adData.next()' ('next (adData)' в Python 3) просто завершает вызов 'adFile. next() '(или, скорее,' Reader_iternext() ', поскольку' csv' завершает расширение C) с некоторой дополнительной обработкой для анализа значений, разделенных запятыми. http://hg.python.org/cpython/file/9046ef201591/Modules/_csv.c#l800. Это не изменилось, так как модуль 'csv' был введен 10 лет назад: http://hg.python.org/cpython/file/cc35ed2b26a8/Modules/_csv.c#l626 (или если он изменился, они вернули изменение в какой-то момент.) – JAB