我有两个def函数,我以嵌套方式调用,并希望在循环中调用第二个函数。我目前只能弄清楚如何手动调用我的列表的语法,而不是应用列表中的每个成员......
#A list of the files I want to read
afiles = [['awc_mm09c.txt','integer'], ['canopy01c.txt','real'],
['canopy10c.txt','real'], ['canopy33c.txt','real'],
['ccapnyp6c.txt','text'], ['gclass09c.txt','text'],
['nyelev09c.txt','real']]
def readfile(fn):
conn = open(ascPath + '\\' + fn, 'r')
# code to read data from the file
def rows(*columns):
# code that merges data from the other files into columns
for ID, cols in enumerate(itertools.izip(*columns)):
yield [ID] + list(cols)
# build the SQL
strQuery = "insert into foo...;"
# run some apsw (SQLite) code
c.execute("begin")
# this works. Is there any way to avoid manually listing each item in the list?
c.executemany(strQuery, rows(readfile(afiles[0][0]),
readfile(afiles[1][0]),
readfile(afiles[2][0]),
readfile(afiles[3][0]),
readfile(afiles[4][0]),
readfile(afiles[5][0]),
readfile(afiles[6][0])))
c.execute("commit")
#I've tried something like the following, but to no avail:
c.executemany(strQuery, rows(
for f in range(len(afiles_dt)):
readfile(afiles_dt[f][0])))
提前致谢。添
答案 0 :(得分:1)
将呼叫替换为{/ 1}}
rows()
答案 1 :(得分:0)
你只需要在'for'之前移动'readfile(afiles [i] [0])' - 因为这是列表理解在python中的工作方式。您可以通过以下方式更新代码:
c.executemany(strQuery, rows(*[readfile(afiles[i][0]) for i in xrange(len(afiles_dt))]))
OR:
c.executemany(strQuery, rows(*[readfile(fInfo[0]) for fInfo in afiles_dt)]))
答案 2 :(得分:0)
rows(*map(lambda (n,t):readfile(n), afiles))
答案 3 :(得分:0)
试试这个:
c.executemany(strQuery, rows(
*[readfile(afiles_dt[f][0]) for f in range(len(afiles_dt))]
))