کار با انواع فرمت ها در پایتون (JSON ،CSV و XML) — به زبان ساده

انعطافپذیری و سهولت استفاده از «زبان برنامهنویسی پایتون» (Python Programming Language)، این زبان را به یکی از محبوبترین زبانها به ویژه برای «دانشمندان داده» (Data Scientist)، مبدل کرده است. یکی از دلایل مهم این امر، سادگی کار با مجموعهدادههای بزرگ در زبان پایتون است. امروزه، همه شرکتهای فناوری، استراتژیهای خاصی را پیرامون «دادهها» برای خود تدوین کردهاند. همه این سازمانها متوجه شدهاند که داشتن دادههای مناسب (معنادار، تمیز و در هر اندازهای که امکان دارد)، به آنها یک مزیت رقابتی کلیدی میدهد. دادهها، اگر به صورت موثر مورد استفاده قرار بگیرند، میتوانند مزیت رقابتی قابل توجهی را برای سازمان به ارمغان بیاورند و بینشی را فراهم کنند که در هیچ کجا و به هیچ شکل دیگر قابل کشف نیست. در طی سالهای اخیر، لیست فرمتهایی که میتوان دادهها را در آنها ذخیره کرد همواره رو به افزایش بوده است. اما در این میان، سه فرمت JSON ،CSV و XML غالب بودهاند. در این مطلب، سادهترین راهکارها برای کار با انواع فرمت ها در پایتون (JSON ،CSV و XML)، بیان شده است.
کار با انواع فرمت ها در پایتون
در ادامه، روش کار با فرمتهای محبوب JSON ،CSV و XML در پایتون بیان و قطعه کدهای لازم برای انجام هر عملیات به طور کامل ارائه شده است.
دادههای CSV
فایلهای CSV (سه حرف CSV، سرنامی برای Comma Separated Values هستند) راهکاری متداول برای ذخیرهسازی دادهها محسوب میشوند. بیشتر دادههایی که در رقابتهای «کگل» (Kaggle) مورد استفاده قرار میگیرند از این نوع هستند. با استفاده از تابع توکار CSV در پایتون، میتوان فایلهای CSV را هم خواند (Read) و هم روی آنها نوشت (Write). به طور متداول، دادهها در یک لیست از لیستها خوانده میشوند. کدی که در ادامه آمده، در این راستا شایان توجه است.
هنگامی که ()csv.reader اجرا شود، همه دادههای CSV در دسترس قرار میگیرند. تابع ()csvreader.next یک خط تنها را از CSV میخواند. هر بار که این تابع فراخوانی شود، به خط بعدی میرود. همچنین، میتواند در هر سطر از فایل CSV با استفاده از حلقه for به صورت for row in csvreader، تکرار داشته باشد (حلقه زدن). باید اطمینان حاصل کرد که تعداد ستونها در کلیه سطرها با هم برابر است. در غیر این صورت، کاربر ممکن است با خطاهایی در حین کار با لیستی از لیستها، مواجه شود.
import csv filename = "my_data.csv" fields = [] rows = [] # Reading csv file with open(filename, 'r') as csvfile: # Creating a csv reader object csvreader = csv.reader(csvfile) # Extracting field names in the first row fields = csvreader.next() # Extracting each data row one by one for row in csvreader: rows.append(row) # Printing out the first 5 rows for row in rows[:5]: print(row)
نوشتن روی فایل CSV در پایتون، به سادگی خواندن دادهها از روی آن است. در این راستا، باید اسامی فیلد را در یک لیست کوتاه تنظیم کرد. این بار، باید یک شی ()writer - توسط کاربر - ساخته شود و از آن برای نوشتن دادهها در یک فایل به شیوهای بسیار مشابه با کاری که برای خواندن دادهها از روی یک فایل انجام شده، استفاده شود.
import csv # Field names fields = ['Name', 'Goals', 'Assists', 'Shots'] # Rows of data in the csv file rows = [ ['Emily', '12', '18', '112'], ['Katie', '8', '24', '96'], ['John', '16', '9', '101'], ['Mike', '3', '14', '82']] filename = "soccer.csv" # Writing to csv file with open(filename, 'w+') as csvfile: # Creating a csv writer object csvwriter = csv.writer(csvfile) # Writing the fields csvwriter.writerow(fields) # Writing the data rows csvwriter.writerows(rows)
البته، نصب کتابخانه فوقالعاده عالی «پانداس» (Pandas) کار با دادهها را پس از خواندن آنها در یک متغیر، بسیار سادهتر میکند. خواندن از یک فایل CSV با استفاده از کتاب پانداس نیز همچون نوشتن روی آن، با یک خط کد امکانپذیر است.
import pandas as pd filename = "my_data.csv" # Read in the data data = pd.read_csv(filename) # Print the first 5 rows print(data.head(5)) # Write the data to file data.to_csv("new_data.csv", sep=",", index=False)
حتی میتوان از پانداس برای تبدیل یک فایل CSV به یک لیست از دیکشنریها (Dictionaries) تنها با یک خط کد، استفاده کرد. هنگامی که دادهها به صورت یک لیست از دیکشنریها قالببندی شدند، از کتابخانه dicttoxml برای تبدیل آن به قالب XML استفاده میشود. همچنین، میتوان آن را به صورت فایل JSON نیز ذخیره کرد.
import pandas as pd from dicttoxml import dicttoxml import json # Building our dataframe data = {'Name': ['Emily', 'Katie', 'John', 'Mike'], 'Goals': [12, 8, 16, 3], 'Assists': [18, 24, 9, 14], 'Shots': [112, 96, 101, 82] } df = pd.DataFrame(data, columns=data.keys()) # Converting the dataframe to a dictionary # Then save it to file data_dict = df.to_dict(orient="records") with open('output.json', "w+") as f: json.dump(data_dict, f, indent=4) # Converting the dataframe to XML # Then save it to file xml_data = dicttoxml(data_dict).decode() with open("output.xml", "w+") as f: f.write(xml_data)
دادههای JSON
«جیسان» (JSON) یک قالب تمیز و به سادگی قابل خواندن را فراهم میکند، زیرا ساختاری با استایل دیکشنری را حفظ میکند. درست مانند CSV، پایتون دارای یک ماژول توکار برای JSON نیز هست که خواندن و نوشتن را فوقالعاده در این فرمت آسان میکند. در پایتون، پس از خوانده شدن یک فایل CSV، به یک دیکشنری مبدل میشود. سپس، دیکشنری مذکور توسط کاربر روی یک فایل نوشته میشود.
import json import pandas as pd # Read the data from file # We now have a Python dictionary with open('data.json') as f: data_listofdict = json.load(f) # We can do the same thing with pandas data_df = pd.read_json('data.json', orient='records') # We can write a dictionary to JSON like so # Use 'indent' and 'sort_keys' to make the JSON # file look nice with open('new_data.json', 'w+') as json_file: json.dump(data_listofdict, json_file, indent=4, sort_keys=True) # And again the same thing with pandas export = data_df.to_json('new_data.json', orient='records')
همانطور که پیش از این مشاهده شد، میتوان دادهها را به سادگی با استفاده از کتابخانه Pandas یا ماژول پایتون توکار CSV به CSV مبدل کرد. برای تبدیل به XML، کتابخانه dicttoxml به کمک کاربر میآید.
import json import pandas as pd import csv # Read the data from file # We now have a Python dictionary with open('data.json') as f: data_listofdict = json.load(f) # Writing a list of dicts to CSV keys = data_listofdict[0].keys() with open('saved_data.csv', 'wb') as output_file: dict_writer = csv.DictWriter(output_file, keys) dict_writer.writeheader() dict_writer.writerows(data_listofdict)
دادههای XML
کار با دادهها در قالب XML، کمی با انواع دادههای CSV و JSON متفاوت است. به طور کلی، CSV و JSON به دلیل سادگی که دارند به طور گسترده مورد استفاده قرار میگیرند. نوشتن، خواندن و تفسیر هر دو نوع فایل بیان شده، برای انسان آسان است. به منظور کار با این دو فرمت داده، نیازی به هیچ کار دیگری (به جز آنچه بیان شد) نیست. تجزیه (Parsing) یک فایل JSON یا CSV بسیار ساده است. اما کار با فایلهای XML اندکی دشوارتر است. این در حالی است که فرمت XML نسبت به JSON و CSV دارای ویژگیهای افزودهای است. کاربر میتواند از فضای نام برای ساخت و به اشتراکگذاری ساختارهای استاندارد، ارائه بهتری برای ارثبری و یک راهکار استانداردشده صنعتی جهت ارائه دادهها با شمای XML و DTD و دیگر موارد استفاده کند. برای خواندن دادههای XML، از ماژول توکار پایتون با زیرماژولی (Sub-Module) با عنوان ElementTree استفاده میشود. از آنجا، میتوان شی ElementTree را با استفاده از کتابخانه xmltodict به یک شی تبدیل کرد. هنگامی که یک دیکشنری وجود دارد، میتوان آن را به JSON ،CSV یا دیتافریم پانداس (مانند آنچه در بالا مشاهده شد) تبدیل کرد.
import xml.etree.ElementTree as ET import xmltodict import json tree = ET.parse('output.xml') xml_data = tree.getroot() xmlstr = ET.tostring(xml_data, encoding='utf8', method='xml') data_dict = dict(xmltodict.parse(xmlstr)) print(data_dict) with open('new_data_2.json', 'w+') as json_file: json.dump(data_dict, json_file, indent=4, sort_keys=True)
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- آموزش یادگیری ماشین (Machine Learning) با پایتون (Python)
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- آموزش یادگیری ماشین با مثالهای کاربردی — مجموعه مقالات جامع وبلاگ فرادرس
- چگونه یک دانشمند داده شوید؟ — راهنمای گامبهگام به همراه معرفی منابع
^^
سلام
ممنون میشم راهنمایی کنید:
چطور میتونم تعداد زیادی فایل text را به یک فایل CSV تبدیل کنم؟
سلام.ممنون از مطلبتون
میخواستم بدونم اطلاعات داخل یک دیکشنری رو چطور میتونم تبدیل به یک فایل txt یا یک فایل csv کنم.
ممنون