Python вставить в базу данных только один данные из кортежа - PullRequest
0 голосов
/ 02 апреля 2019

У меня проблема. Мне нужно разобрать несколько 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 голосов
/ 04 апреля 2019

Поскольку у меня нет прав администратора для установки lxml на моем компьютере, я буду использовать батарею (класс), которая включена в Python по умолчанию для работы с XPATH - xml.etree.ElementTree . Однако мой код покажет вам, как вставить несколько записей в SQLITE, используя executemany ()

Похоже, в 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>

Создан регистр базы данных sqlite с именем xml.db и таблица в нем со следующим оператором

CREATE TABLE PARSEE (NAME VARCHAR(100));

А вот и мой скрипт на питоне

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...