我正在阅读的文件格式如下:
12 #block belonging to ID1
78
60
98
7
65 #block belonging to ID2
14
22
每个块都以空行终止,每个块属于一个ID。我想将此信息插入到一个表中,其中包含两个字段ID_from(这是块的ID所属)和ID_to(块中的数字)。所以对于前:
ID_from ID_to
1 12
1 78
1 60
1 98
1 7
2 65
2 14
2 22
我有一个复合主键,它是这两个字段的组合,允许我在ID_from列中重复相同的ID。这是我的问题代码:
citations = line
my_list = []
my_list.append(citations)
my_list = " ".join(my_list)
db1.execute('''INSERT INTO citations(
ID_from, ID_to) VALUES(%s,%s)''',
(ID, my_list))
conn.commit()
(ID已在代码的前面定义)。我相信通过此代码实现的是创建list- citations_collect []并将块的每一行附加到列表 - 实质上是应该插入到ID_to列中的所有值的列表。我得到的当前输出只是每个块中的最后一个值及其出现的相应块ID。即:
ID_from ID_to
1 7
2 22
我的猜测是我应该将执行查询放入循环中,但我不确定循环应该包含什么。我试图用join函数做的是将每个块的值存储在一个由空格分隔的行中的列表中,并且插入到表中会更简单但是我没有对输出产生影响。 我是python和mysql的新手,所以我感谢任何反馈!
答案 0 :(得分:0)
如果没有看到完整的代码,很难推荐一些东西。无论如何,我想这是因为你在循环中逐行读取文件,并且在每个循环中你定义my_list
。因此,在每个循环中my_list
只包含一个项目,并且在块的末尾,您将最后一个项目写入数据库。
你可以尝试这样的事情:
id_from = 1
my_list = []
for line in file:
if line.strip() == '':
# update your database
id_from += 1
my_list = []
else:
my_list.append(line)
答案 1 :(得分:0)
试试这个:
f = open('my_file.txt', 'r')
list1 = f.read().splitlines()
id_from = 1
for id_to in list1:
if id_to == '':
id_from += 1
continue
db1.execute('''INSERT INTO citations(
ID_from, ID_to) VALUES(%s,%s)''',
(id_from, id_to))
conn.commit()
您可以以更有效的方式使用您的SQL查询而不是这个。