Python仅将元组中的一个数据插入数据库

时间:2019-04-02 13:37:05

标签: python sqlite parsing

我有问题。我需要解析多个xml文件并将数据插入数据库。

import os 
from lxml import etree
import sqlite3
conn = sqlite3.connect("xml.db")
cursor = conn.cursor()
path = 'C:/tools/XML'
for filename in os.listdir(path):
    fullname = os.path.join(path, filename)
    tree = etree.parse(fullname)
    test = tree.xpath('//*[@name="Name"]/text()')
    tpl = tuple(test)
    cursor.executemany("INSERT INTO parsee VALUES (?);", (tpl,))
conn.commit()
sql = "SELECT * FROM parsee"
cursor.execute(sql)
print(cursor.fetchall())

结果:

[('testname1',)]

如果我再次运行该程序,该程序将添加另一个相同的名称。结果:

[('testname1',),('testname1',)]

文件夹中有100个文件:

<curent name="Name">testname1<curent>
<curent name="Name">testname2<curent>
<curent name="Name">testname3<curent>
<curent name="Name">testname4<curent> 

1 个答案:

答案 0 :(得分:0)

由于我没有在计算机上安装lxml的管理员权限,因此我将使用默认情况下Python附带的电池(类)来处理XPATH- xml.etree.ElementTree 。但是,我的代码将向您展示如何使用executemany()在SQLITE中插入多个记录

在C:/ tools / XML中,您将看到许多具有相同结构的xml文件。 我将以下两个放在文件夹中以模拟此情况(我注意到您的示例以“ curent”作为元素,不确定是不是错字,我使用的是“ current”)

file1.xml

<note>
    <current name="Name">testname1</current>
    <current name="Name">testname2</current>
    <otherdetail></otherdetail>    
</note>

file2.xml

<note>
    <current name="Name">testname3</current>
    <current name="Name">testname4</current>
    <otherdetail></otherdetail>    
</note>

使用以下语句创建了一个名为xml.db的sqlite数据库用例,并在其中创建了一个表

CREATE TABLE PARSEE (NAME VARCHAR(100));

这是我的python脚本

import os 
import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect("xml.db")
cursor = conn.cursor()
path = 'C:/tools/XML'
for filename in os.listdir(path):
    fullname = os.path.join(path, filename)
    print("Parsing file: %s" %fullname)
    tree = ET.parse(fullname)
    root = tree.getroot()
    elements = root.findall(".//*[@name='Name']");
    names = [(e.text,)  for e in elements]
    print("Names found: %s" %names)
    cursor.executemany("INSERT INTO PARSEE VALUES (?)", names)
conn.commit()
sql = "SELECT * FROM PARSEE"
print("Printing table PARSEE content")
cursor.execute(sql)
print(cursor.fetchall())

这是输出

enter image description here