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