Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2024, 18:03   #1
Kapkom
Пользователь
 
Регистрация: 22.09.2014
Сообщений: 27
По умолчанию Чтение огромных xml-файлов

Добрый день!

У меня есть код по превращению xml-файла в DataFrame:

ColNames = ['ObjectId','DateEnd','ZagolType','Z agolValue1']
df_list = []
tstep = 0

for fl in ListFxml2:
if '_houses_params' in fl.lower():
tree = ET.parse(Pxml + '/' + fl)
root = tree.getroot()
for level in root:
row = [level.attrib['OBJECTID'],level.attrib['ENDDATE'],level.attrib['TYPEID'],level.attrib['VALUE']]
df_list.append(row)
else: pass

DFhouseParam = pd.DataFrame(df_list, columns=ColNames)

Этот код хорошо отрабатывает на файле, весом 1,7гб. Но на файле 3,77гб подвисает на шаге tree = ET.parse(Pxml + '/' + fl), и процедура в итоге вылетает (автоматически перезагружается kernel).

Подскажите, пожалуйста, как ещё можно прочитать в Python такой огромный xml-файл?
Или как его можно раздробить (без ET.parse)?

Буду очень благодарен за помощь!
Kapkom вне форума Ответить с цитированием
Старый 08.07.2024, 02:04   #2
MakarovDs
Пользователь
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 43
По умолчанию

Kapkom,
Есть несколько способов чтения больших XML-файлов в Python без использования ET.parse(), который может потреблять много памяти и приводить к ошибкам нехватки памяти для больших файлов.

Один из способов — использовать потоковый парсер, такой как xml.sax.parse(). Потоковые парсеры обрабатывают XML-файл построчно, что позволяет читать большие файлы без загрузки всего файла в память.

Вот пример кода, который использует xml.sax.parse() для чтения большого XML-файла:

Код:
import xml.sax

class MySAXHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.data = []

    def startElement(self, name, attrs):
        # Обработка начала элемента
        pass

    def characters(self, content):
        # Обработка содержимого элемента
        self.data.append(content)

    def endElement(self, name):
        # Обработка конца элемента
        pass

def parse_xml(filename):
    # Создаем обработчик SAX
    handler = MySAXHandler()

    # Парсим XML-файл
    parser = xml.sax.make_parser()
    parser.setContentHandler(handler)
    parser.parse(filename)

    # Возвращаем обработанные данные
    return handler.data
Вы можете использовать этот код следующим образом:

Код:
data = parse_xml("large_xml_file.xml")
Переменная data будет содержать список строк с данными XML-файла. Вы можете затем обработать эти данные и преобразовать их в DataFrame.

Еще один способ чтения больших XML-файлов — использовать библиотеку xmltodict. Эта библиотека преобразует XML-файл в словарь Python, который затем можно преобразовать в DataFrame.

Вот пример кода, который использует xmltodict для чтения большого XML-файла:

Код:
import xmltodict

with open("large_xml_file.xml", "r") as f:
    xml_data = f.read()

data = xmltodict.parse(xml_data)
Переменная data будет содержать словарь Python с данными XML-файла. Вы можете затем обработать этот словарь и преобразовать его в DataFrame.

Наконец, вы также можете разбить большой XML-файл на более мелкие файлы. Это можно сделать с помощью таких инструментов, как split, csplit или xxd. После разделения файла вы можете обработать каждый меньший файл отдельно.

Надеюсь, это поможет!
MakarovDs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись бинарных файлов огромных размеров без использования массивов Kol1k C# (си шарп) 1 28.06.2021 09:27
Сравнение огромных (невероятно огромных) чисел Scrzii Помощь студентам 4 25.11.2018 20:56
чтение файлов .xml aldeano Microsoft Office Excel 4 14.12.2013 18:18
чтение wav файлов asdbsa Общие вопросы C/C++ 2 21.10.2013 12:15
чтение ini файлов Sparky Помощь студентам 2 21.05.2012 16:48