Python 实现生成器以填充数据库
我不能完全控制发电机,有时我碰巧以正确的方式使用它们,有时我不这样做 我正在从.csv文件填充数据库:Python 实现生成器以填充数据库,python,database,generator,Python,Database,Generator,我不能完全控制发电机,有时我碰巧以正确的方式使用它们,有时我不这样做 我正在从.csv文件填充数据库: name, location Tom, France Doug, USA Michael, UK 这是我的密码: def process_csv(filecsv): f = open(filecsv) f_csv = csv.reader(f) headers = next(f_csv) User = namedtuple('User', headers)
name, location
Tom, France
Doug, USA
Michael, UK
这是我的密码:
def process_csv(filecsv):
f = open(filecsv)
f_csv = csv.reader(f)
headers = next(f_csv)
User = namedtuple('User', headers)
for user in f_csv:
user = [u.strip() for u in user]
user = User(*user)
yield user
def insert(cur, user):
u = list(user)[0] # it's a one-elem list so take it
cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)",
(u.name, u.location))
if __name__ == '__main__':
cur = cxn.cursor()
user = process_csv(filecsv)
insert(cur, user)
运行此命令时,只有第一行被插入到数据库中。您可以建议如何修复它吗?process\u csv(filecsv)
在用户上返回迭代器insert
将迭代器转换为列表,并显式获取第一项。(注释是错误的;它不是一个单元素列表。)相反,在用户上循环并插入每个用户:
def insert(cur, users):
for user in users:
cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)",
(user.name, user.location))
请注意,执行此数据库操作几乎肯定有更好的方法。这个答案只解决了生成器问题。process\u csv(filecsv)
在用户上返回迭代器insert
将迭代器转换为列表,并显式获取第一项。(注释是错误的;它不是一个单元素列表。)相反,在用户上循环并插入每个用户:
def insert(cur, users):
for user in users:
cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)",
(user.name, user.location))
请注意,执行此数据库操作几乎肯定有更好的方法。这个答案只解决了发电机问题。我想你离目标还不远, 试试这个:
def process_csv(filecsv):
f = open(filecsv)
f_csv = csv.reader(f)
headers = next(f_csv)
User = namedtuple('User', headers)
for user in f_csv:
user = [u.strip() for u in user]
user = User(*user)
yield user
def insert(cur, user):
cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)",
(user.name, user.location))
if __name__ == '__main__':
cur = cxn.cursor()
for user in process_csv():
insert(cur,user)
Generator是一个迭代器,所以你应该像迭代器一样使用它,我想你离目标不远了, 试试这个:
def process_csv(filecsv):
f = open(filecsv)
f_csv = csv.reader(f)
headers = next(f_csv)
User = namedtuple('User', headers)
for user in f_csv:
user = [u.strip() for u in user]
user = User(*user)
yield user
def insert(cur, user):
cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)",
(user.name, user.location))
if __name__ == '__main__':
cur = cxn.cursor()
for user in process_csv():
insert(cur,user)
Generator是迭代器,因此您应该像迭代器一样使用它我们看不到如何调用这两个函数。特别是,它们似乎没有联系;他们两个都不给对方打电话。这些功能是如何关联的?只是说,如果这是一次性工作,大多数数据库都有直接从CSV文件导入的功能。e、 我们看不出这两个函数是如何调用的。特别是,它们似乎没有联系;他们两个都不给对方打电话。这些功能是如何关联的?只是说,如果这是一次性工作,大多数数据库都有直接从CSV文件导入的功能。e、 g.和