Найти - Пользователи
Полная версия: xml множество файлов в разных папках собрать воедино
Начало » Базы данных » xml множество файлов в разных папках собрать воедино
1 2 3 4 5 6
Shaman
evp24
а как?
как-то так:
 # coding: utf-8
 
import re
import sqlite3
import lxml.etree as ET
from datetime import datetime
from itertools import count
 
NAME = re.compile(ur'([\w-]+)\s+([\w-]+)\s*([\w\s-]*)', re.I + re.U)
 
 
def data_iter(root):
    for item in root.iter('item'):
        yield {i.tag: i.text for i in item}
 
 
def name_split(name):
    fam, im, ot = NAME.match(name.upper()).groups()
    return fam, im, ot
 
 
class _Database(object):
    def __init__(self):
        self.con = sqlite3.connect('data.db')
        self.cur = self.con.cursor()
        self.cur.execute(
            '''CREATE TABLE IF NOT EXISTS "patient" ( `id` INTEGER, `n5` TEXT, `n6` TEXT, `fam` TEXT, `im` TEXT, 
            `ot` TEXT, `drd` DATE, `drdy` TEXT, `lnkd` DATE, `smo_cod` INTEGER, PRIMARY KEY(`id`) )''')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_drd` ON `patient` (`drd` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_drdy` ON `patient` (`drdy` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_fam` ON `patient` (`fam` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_im` ON `patient` (`im` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_n6` ON `patient` (`n6` )')
        self.cur.execute('CREATE INDEX IF NOT EXISTS `ix_patient_ot` ON `patient` (`ot` )')
        self.cur.execute('CREATE UNIQUE INDEX IF NOT EXISTS `ix_patient_primary_key` ON `patient` (`id` )')
        self.cur.execute('DELETE FROM `patient`')
 
    def append(self, rec):
        self.cur.execute("insert into `patient` values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", rec)
 
    def close(self):
        self.con.commit()
        self.cur.close()
 
 
def main(name):
    db = _Database()
    tree = ET.parse(name)
    root = tree.getroot()
    counter = count(1)
    for item in data_iter(root):
        fam, im, ot = name_split(item['attr_84896_'])
        dr = datetime.strptime(item['attr_84891_'], '%d.%m.%Y').date()
        dl = datetime.strptime(item['attr_84913_'], '%d.%m.%Y').date()
        db.append([
            counter.next(),
            '',
            item['attr_84895_'],
            fam, im, ot,
            dr,
            str(dr.year),
            dl,
            0,
        ])
    db.close()
 
 
if __name__ == '__main__':
    main('data.xml')

evp24
от WINDOWS отказался
На воду дуете.
doza_and
evp24
а как?
1. Надо понять сколько у вас данных. 100ТБ и 10 МБ требуют разных подходов. У меня сложилось мнение что данных у вас кот наплакал. Приведенный у вас файл с товарами в xml пара мегабайт. В этом случае проще вообще все данные затащить в память (если вам конечно не требуются продвинутые sql запросы). Если я ошибаюсь то последующие действия могут быть другими
2. Считываете данные из ваших xml при помощи пакета lxml или еще чего. - получаете dom.
3. Запросами к dom выковыриваете данные. и помещаете их в списки словарей (требует меньшего знания питона) или в таблицы пакета pandas, который и предназначен для работы с небольшими таблицами. На этом этапе данные можно сохранить в пиклы csv или еще как.
4. Разрабатыаете приложение для работы с данными, и соответственно выбираете способ хранения обновления При использовании надо оперативно изменять только малую часть данных, а не считывать и сохранять все, как требуется при импорте. Для этого как раз хорошо приспособлены базы данных.

p.s.
Во всей переписке я не увидел ни единого куска вашего кода. Не видно ни единого намека на то как вы потом собираетесь эти данные использовать. Поэтому складывается впечатление что вам проще нанять специалиста чем делать самим.
Печалька еще в том, что похоже полезных данных в приведенном вами xml практически нет. Только названия товаров похоже. Я не увидел как можно определить что на складе что в остатке и т.п. будьте готовы к тому что ничего полезного из этой затеи не выйдет.
evp24
doza_and
Надо понять сколько у вас данных. 100ТБ и 10 МБ

сам файл 3 мб. я его приложил выше

doza_and
Считываете данные из ваших xml при помощи пакета lxml или еще чего. - получаете dom.

Пробовал по этому примеру. Не получилось
выполняю код в netbeans ))

doza_and
не увидел как можно определить что на складе что в остатке и т.п. будьте готовы к тому что ничего полезного из этой затеи не выйдет.

Это главный файл, с товарами. Есть и другие
Цель, пока, понять, на НЕМ (как самом сложном)
как сделать то, что нужно. Научиться.
evp24
Shaman
как-то так:

попробовал поставить sqlite, пишет

[code ini]
~$ pip install sqlite3
Collecting sqlite3
Downloading sqlite3-99.0.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-z8SdZJ/sqlite3/setup.py", line 2, in <module>
raise RuntimeError("Package 'sqlite3' must not be downloaded from pypi")
RuntimeError: Package 'sqlite3' must not be downloaded from pypi

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-z8SdZJ/sqlite3/
[/code]

FishHook
evp24
а вы пробовали импортировать этот пакет? Не помню, чтобы мне хоть раз приходилось его устанавливать, он всегда шел с питоном по умолчанию.
evp24
FishHook
evp24а вы пробовали импортировать этот пакет? Не помню, чтобы мне хоть раз приходилось его устанавливать, он всегда шел с питоном по умолчанию.

Если делаю через python 3.5 выдает это

  File "/home/irip/test/py/PY/setup.py", line 9
NAME = re.compile(ur'([\w-]+)\s+([\w-]+)\s*([\w\s-]*)', re.I + re.U)
^
SyntaxError: invalid syntax

FishHook
evp24
Если делаю через python 3.5 выдает это
Ну и при чем тут sqlite3 вообще?
Shaman
evp24
Если делаю через python 3.5 выдает это
Пример на python2, который я обычно использую. Применение его как есть Вам точно не нужно.
vic57
evp24
Пробовал по этому примеру. Не получилось
что именно?
 from lxml import etree
    
def get_node(node):
    print(node.tag,node.attrib,node.text)
    for n in node: get_node(n)
    
tree = etree.parse('DBSchema.xml')
get_node(tree.getroot())
выхлоп покажите
must read
evp24
vic57
выхлоп покажите

в 2.7 выдало:
Traceback (most recent call last):
File "/home/irip/test/py/xml/setup.py", line 1, in <module>
from lxml import etree
ImportError: No module named lxml


в 3.5 выдало:
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB