از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خواندن و نوشتن فایل های XML در پایتون با پانداها
سرفصلهای مطلب
معرفی
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