1

我认识到这段代码效率极低。

我在这里完全不知所措,我打算删除该功能,并在 main.js 中使代码程序化。但我希望有人能解释我在这里看到的。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()
4

1 回答 1

2

问题是循环adData导致adFile读取,因此在第一次调用matchName()文件后将一直读取,因此adData不会循环,因为adData.next()不会导致任何结果(因此print语句不会执行)。adFile.seek(0)我建议在调用之后放置matchName()。请注意,仅重新创建是adData行不通的;我最近发现 csv 阅读器会更新其底层对象的文件位置,而不是自己跟踪它。

于 2013-06-28T15:44:16.177 回答