وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

خواندن و نوشتن فایل های XML در پایتون با پانداها

0 116
زمان لازم برای مطالعه: 6 دقیقه


معرفی

XML (Extensible Markup Language) یک زبان نشانه گذاری است که برای ذخیره داده های ساخت یافته استفاده می شود. کتابخانه تجزیه و تحلیل داده پانداها عملکردهایی را برای خواندن/نوشتن داده ها برای اکثر انواع فایل ها فراهم می کند.

مثلاً شامل می شود read_csv() و to_csv() برای تعامل با فایل های CSV با این حال، Pandas هیچ روشی برای خواندن و نوشتن فایل‌های XML ندارد.

در این مقاله، نگاهی خواهیم داشت به اینکه چگونه می‌توانیم از ماژول‌های دیگر برای خواندن داده‌ها از یک فایل XML استفاده کنیم و آن‌ها را در Pandas DataFrame بارگذاری کنیم. ما همچنین داده‌ها را از یک Pandas DataFrame می‌گیریم و در یک فایل XML می‌نویسیم.

خواندن XML با پانداها

بیایید نگاهی به چند روش برای خواندن داده‌های XML و قرار دادن آن در Pandas DataFrame بیندازیم.

برای این بخش، ما از یک مجموعه داده ورودی برای هر اسکریپت استفاده خواهیم کرد. XML زیر را در فایلی به نام ذخیره کنید properties.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <bathrooms>
        <n35237 type="number">1.0</n35237>
        <n32238 type="number">3.0</n32238>
        <n44699 type="number">nan</n44699>
    </bathrooms>
    <price>
        <n35237 type="number">7020000.0</n35237>
        <n32238 type="number">10000000.0</n32238>
        <n44699 type="number">4128000.0</n44699>
    </price>
    <property_id>
        <n35237 type="number">35237.0</n35237>
        <n32238 type="number">32238.0</n32238>
        <n44699 type="number">44699.0</n44699>
    </property_id>
</root>

خواندن با xml.etree.ElementTree

این xml.etree.ElementTree ماژول با پایتون ساخته شده است. این قابلیت برای تجزیه و ایجاد اسناد XML فراهم می کند. ElementTree سند XML را به صورت درختی نشان می دهد. ما می توانیم با استفاده از گره هایی که عناصر و عناصر فرعی فایل XML هستند، در سراسر سند حرکت کنیم.

در این رویکرد، محتوای فایل را در یک متغیر می خوانیم و استفاده می کنیم ET.XML() برای تجزیه سند XML از ثابت رشته. ما با حفظ فهرستی از داده‌های موجود در هر کودک و فرزند فرعی، حلقه می‌زنیم. در همین حال، نوشتن تگ های فرزند برای ستون DataFrame. سپس این داده ها را در یک DataFrame می نویسیم.

توجه داشته باشید: هنگام خواندن داده‌ها از XML، باید DataFrame را جابه‌جا کنیم، زیرا عناصر فرعی فهرست داده‌ها در ستون‌هایی نوشته می‌شوند.

بیایید به کد برای نشان دادن استفاده از آن نگاه کنیم xml.etree.ElementTree:

import xml.etree.ElementTree as ET
import pandas as pd

xml_data = open('properties.xml', 'r').read()  
root = ET.XML(xml_data)  

data = ()
cols = ()
for i, child in enumerate(root):
    data.append((subchild.text for subchild in child))
    cols.append(child.tag)

df = pd.DataFrame(data).T  
df.columns = cols  
print(df)

کد بالا این خروجی را تولید می کند (متفاوت است روی فایل ورودی استفاده شده):

  bathrooms       price property_id
0       1.0   7020000.0     35237.0
1       3.0  10000000.0     32238.0
2       nan   4128000.0     44699.0

خواندن با lxml

این lxml کتابخانه یک اتصال پایتون برای کتابخانه های C است libxml2 و libxslt. همچنین بومی را گسترش می دهد ElementTree مدول. از آنجایی که این ماژول شخص ثالث است، باید آن را با آن نصب کنید pip مثل این:

$ pip install lxml

بر خلاف ElementTree، ما داده های فایل را نمی خوانیم و آن را تجزیه نمی کنیم. ما می توانیم مستقیما استفاده کنیم objectify.parse() و مسیر فایل XML را به آن بدهید. برای بدست آوردن root عنصر، ما استفاده خواهیم کرد getroot() روی داده های XML تجزیه شده

اکنون می‌توانیم از طریق عناصر فرزند از حلقه استفاده کنیم root node و آنها را در لیست پایتون بنویسید. مانند قبل، یک DataFrame با استفاده از لیست داده ایجاد می کنیم و DataFrame را جابجا می کنیم.

بیایید به کد ایجاد یک Pandas DataFrame با استفاده از آن نگاه کنیم lxml:

from lxml import objectify
import pandas as pd

xml_data = objectify.parse('properties.xml')  
root = xml_data.getroot()  

data = ()
cols = ()
for i in range(len(root.getchildren())):
    child = root.getchildren()(i)
    data.append((subchild.text for subchild in child.getchildren()))
    cols.append(child.tag)

df = pd.DataFrame(data).T  
df.columns = cols  
print(df)

اگر این را اجرا کنیم روی مفسر پایتون، خروجی زیر را می بینیم:

  bathrooms       price property_id
0       1.0   7020000.0     35237.0
1       3.0  10000000.0     32238.0
2       nan   4128000.0     44699.0

خواندن با xmltodict

این xmltodict ماژول داده های XML را همانطور که از نامش پیداست به فرهنگ لغت پایتون تبدیل می کند. پسندیدن lxml، این یک ماژول شخص ثالث است که باید با آن نصب کنیم pip:

$ pip install xmltodict

همانطور که قبلا انجام دادیم، محتویات XML را در یک متغیر می خوانیم. ما این داده ها را در parse() روشی که دیکشنری از داده های XML را برمی گرداند. این یک دیکشنری تودرتو خواهد بود که دارای عناصر و عناصر فرعی فایل XML است. می‌توانیم عناصر را حلقه بزنیم و آنها را در فهرست داده‌ای بنویسیم که از آن برای ایجاد یک DataFrame استفاده می‌کنیم.

بیایید نگاهی به کد تجزیه اطلاعات XML برای ایجاد یک DataFrame با استفاده از آن بیاندازیم xmltodict:

import xmltodict
import pandas as pd

xml_data = open('properties.xml', 'r').read()  
xmlDict = xmltodict.parse(xml_data)  

cols = xmlDict('root').keys()
data = ()

for i in xmlDict('root'):
    child = xmlDict('root')(i)
    data.append((child(subchild)('#text') for subchild in child))

df = pd.DataFrame(data).T  
df.columns = cols
print(df)

اگر کد بالا را اجرا کنیم، خروجی را به صورت زیر می بینیم:

  bathrooms       price property_id
0       1.0   7020000.0     35237.0
1       3.0  10000000.0     32238.0
2       nan   4128000.0     44699.0

توجه داشته باشید: xmltodict کتابخانه برای فایل های XML بزرگ توصیه نمی شود زیرا بسیاری از توسعه دهندگان کاهش عملکرد را مشاهده کرده اند. این lxml کتابخانه به عنوان سریعترین کتابخانه در کار با XML شناخته می شود، حتی سریعتر از موجود xml.etree.ElementTree.

از بهترین چیز برای پروژه خود استفاده کنید، و اگر عملکرد حیاتی است، باید آزمایش هایی را با هر کتابخانه انجام دهید.

نوشتن XML با پانداها

بیایید به روش های مختلف برای نوشتن Pandas DataFrame در یک فایل XML نگاه کنیم. هر اسکریپتی که در زیر استفاده می کنیم یک فایل جدید به نام ایجاد می کند مختصات.xml با مطالب زیر:

<root>
  <A>
    <X>1.3</X>
    <Y>2.6</Y>
    <Z>2.1</Z>
  </A>
  <B>
    <X>1.4</X>
    <Y>1.4</Y>
    <Z>5.6</Z>
  </B>
  <C>
    <X>5.2</X>
    <Y>4.6</Y>
    <Z>4.6</Z>
  </C>
</root>

نوشتن با توکار نوشتن() تابع

ما می توانیم از گنجانده شده استفاده کنیم write() تابعی برای فایل ها برای نوشتن DataFrame به عنوان یک فایل XML. برای انجام این کار، فهرستی از داده‌های XML را نگه می‌داریم، به طوری که هر مورد یک خط را در XML نشان دهد. سپس روی DataFrame تکرار می کنیم و داده ها را با تگ های باز و بسته مناسب XML در لیست داده ها می نویسیم.

پس از تکمیل، یک بار دیگر روی لیست تکرار می کنیم تا داده ها را در فایل XML بنویسیم. در اینجا کدی است که استفاده از آن را نشان می دهد write():

import pandas as pd

df = pd.DataFrame(((1.3, 1.4, 5.2),
                   (2.6, 1.4, 4.6),
                   (2.1, 5.6, 4.6)),
                  columns=('A', 'B', 'C'),
                  index=('X', 'Y', 'Z'))

xml_data = ('<root>')
for column in df.columns:
    xml_data.append('<{}>'.format(column))  
    for field in df.index:
        
        xml_data.append('<{0}>{1}</{0}>'.format(field, df(column)(field)))
    xml_data.append('</{}>'.format(column))  
xml_data.append('</root>')

with open('coordinates.xml', 'w') as f:  
    for line in xml_data:
        f.write(line)

با اجرای این کد فایلی به نام تولید می شود مختصات.xml در دایرکتوری فعلی

نوشتن فایل های XML با xml.etree.ElementTree

به طور پیش فرض xml.etree.ElementTree ماژول را می توان برای ذخیره داده ها به صورت XML و تبدیل آن به یک رشته استفاده کرد تا بتوان آن را در یک فایل نوشت.

اولین قدم ما ایجاد root عنصر سپس روی ستون‌ها و ردیف‌های DataFrame تکرار می‌کنیم و آنها را به عنوان عناصر و عناصر فرعی در ElementTree اضافه می‌کنیم. سپس آن را تبدیل می کنیم ElementTree داده های شی به یک رشته باینری با استفاده از tostring() روش.

از آنجایی که داده های XML یک رشته باینری هستند، قبل از نوشتن آن در فایل، آن را به UTF-8 رمزگشایی می کنیم.

کد زیر استفاده می کند xml.etree.ElementTree برای نوشتن یک DataFrame به عنوان یک فایل XML:

import xml.etree.ElementTree as ET
import pandas as pd

df = pd.DataFrame(((1.3, 1.4, 5.2),
                   (2.6, 1.4, 4.6),
                   (2.1, 5.6, 4.6)),
                  columns=('A', 'B', 'C'),
                  index=('X', 'Y', 'Z'))
header = df.columns

root = ET.Element('root')  

for column in df.columns:
    entry = ET.SubElement(root, column)  
    for row in df.index:
        schild = row
        child = ET.SubElement(entry, schild)  
        child.text = str(df(column)(schild))

xml_data = ET.tostring(root)  
with open('coordinates.xml', 'w') as f:  
    f.write(xml_data.decode('utf-8'))

مانند قبل، اجرای این اسکریپت باعث ایجاد یک می شود مختصات.xml فایل با خروجی مورد انتظار

نوشتن فایل های XML با lxml

استفاده کردن lxml شبیه روش استفاده ما است xml.etree.ElementTree. ما با ایجاد یک شروع می کنیم etree شی با root عنصر فایلی که در حال ایجاد آن هستیم. سپس روی DataFrame تکرار می کنیم و ستون ها و ردیف ها را به عنوان عناصر و عناصر فرعی درخت اضافه می کنیم. در نهایت ما از tostring() روش به دست آوردن etree به عنوان یک رشته باینری فایل را پس از رمزگشایی رشته باینری در UTF-8 می نویسیم.

در اینجا کدی برای نوشتن DataFrame به صورت XML با استفاده از آن وجود دارد lxml:

from lxml import etree as et
import pandas as pd

root = et.Element('root')  
df = pd.DataFrame(((1.3, 1.4, 5.2),
                   (2.6, 1.4, 4.6),
                   (2.1, 5.6, 4.6)),
                  columns=('A', 'B', 'C'),
                  index=('X', 'Y', 'Z'))

for column in df.columns:
    entry = et.SubElement(root, column)  
    for row in df.index:
        schild = row
        child = et.SubElement(entry, schild)  
        child.text = str(df(column)(schild))

xml_data = et.tostring(root)  
with open('coordinates.xml', 'w') as f:  
    f.write(xml_data.decode('utf-8'))

پس از اتمام موفقیت آمیز، مشاهده خواهید کرد مختصات.xml با مختصات XML

نتیجه

این آموزش راه های مختلفی را نشان می دهد که ما می توانیم داده های XML را با Pandas DataFrames بخوانیم و بنویسیم. شما می توانید داده ها را با داخلی بخوانید xml.etree.ElementTree ماژول، و همچنین دو ماژول شخص ثالث: lxml و xmltodict.

برای نوشتن یک Pandas DataFrame به یک فایل XML، از فایل معمولی استفاده کرده ایم write() با لیست ها، xml.etree.ElementTree ماژول و lxml. با توجه به اینکه دستکاری رشته های XML به طور مستقیم برای نوشتن یک فایل بیشتر مستعد خطای انسانی است، xml.etree.ElementTree و lxml راه حل های ارجح برای صادرات یک DataFrame به XML هستند.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-14 04:35:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید