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

JSON که کوتاه شده JavaScript Object Notation است ، فرمت استاندارد و مستقل از پلتفرم و یا زبان برنامه نویسی است که از آن برای تبادل اطلاعات (Information Exchange) میان سیستم های مختلف و مستقل از یکدیگر استفاده می شود. در این نوشته نحوه خواندن و نوشتن فایل های json در پایتون را آموزش می دهیم. اگر اطلاعاتی در این زمینه ندارید، یاد میگیرند که چگونه فایل های json که روی سیستم یا روی شبکه وجود دارند را بخوانیم و همچنین چگونه فایل های json را ایجاد کنیم.
همچنین در صورتی که در زمینه آموزش پایتون نیاز به کمک دارید، توصیه می کنید تا آموزش زبان برنامه نویسی پایتون را مشاهده کنید. در پایتون ماژول استانداردی به نام json وجود دارد که تمامی نیازهای خواندن و ایجاد کردن فرمت json را پوشش می دهد. همچنین می توانید از کتابخانه Pandas نیز برای خواندن و نوشتن فرمت JSON در پایتون کمک بگیرید.
برای این که بتوانید در مسیر که برای آموزش طراحی سایت دارید بهترین باشید پیشنهاد میکنم که حتما مقاله نقشه راه یادگیری پایتون را مرور کنید و روی نقشه ای که دارید به آموزش پایتون بپردازید.
نوشتن کد JSON در پایتون
در کد زیر نمونه ساده ای از داده های به فرمت json را نشان می دهد که متشکل از چندین جفت کلید و مقدار است که میان آکولاد های باز و بسته شده قرار دارند. برای شروع لطفا کد زیر را در یک فایل با پسوند json ذخیره کنید تا در ادامه این فایل را خوانده و پردازش کنیم.
{
"coord":{
"lon":51.4,
"lat":35.7
},
"weather":[
{
"id":800,
"main":"Clear",
"description":"clear sky",
"icon":"01d"
}
],
"base":"stations",
"main":{
"temp":303.44,
"pressure":1015,
"humidity":16,
"temp_min":301.15,
"temp_max":305.15
},
"visibility":10000,
"wind":{
"speed":5.1,
"deg":200
},
"clouds":{
"all":0
},
"dt":1529478000,
"sys":{
"type":1,
"id":7032,
"message":0.0023,
"country":"IR",
"sunrise":1529457518,
"sunset":1529510003
},
"id":112931,
"name":"Tehran",
"cod":200
}
کد های بالا، json هستند. در صورتی که این کد ها را متوجه نشدید، بهتر است تا آموزش برنامه نویسی جاوا اسکریپت را مشاهده کنید. در صورتی که به درک مناسبی از زبان برنامه نویسی جاوا اسکریپت برسید، می توانید کد های جی سان را به درستی استفاده کنید. همچنین در صورتی که قصد خواندن و نوشتن فایل های json در پایتون را داشته باشید، نیاز است تا درک درستی از کد های جی سان داشته باشید.
ایجاد محتوای json از دیکشنری های پایتون
پیش از هر چیزی باید ابتدا ماژولی به نام json را به درون برنامه ضمیمه کنیم. این ماژول شامل تمامی توابعی است که برنامه های پایتون برای کار با فرمت داده json نیاز دارند. برای تبدیل شی های پایتون به شی json از متد ()dumps استفاده می شود. این متد حداقل یک شی پایتون مانند دیکشنری را دریافت می کند و سپس فرمت شده json متغیر ورودی را برگشت می دهد.
data = [{'name': 'amir', 'age': 34}, {'name': 'hamid', 'age': 31}]
json_data = json.dumps(data)
print(json_data)
در مثال بالا متغیر data که آرایه ای از دیکشنری ها است به متد ()dumps ارسال شده و خروجی اجرای برنامه بالا، فرمت json از داده های درون دیکشنری است.
اگر بخواهیم در خروجی کلیدهای مرتب شوند باید مقدار پارامتر sort_keys به برابر با مقدار True باشد. همچنین می توانید چگونگی مرتب سازی دیکشنری ها را از اینجا بخوانید.
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
پارامتر دیگری که می توانیم در متد ()dumps استفاده کنیم، indent نام دارد که فرمت json قابل نمایش را با فاصله گذاری در خروجی نشان می دهد. لطفا شکل زیر و شکل بالا را با هم مقایسه کنید.
خواندن فایل های json در پایتون
به حالتی که شی پایتون را به شی یا فرمت json تبدیل می کنیم، عملیات decoding می گویم. عکس decoding عملیات decoding نام دارد که باید داده های به فرمت json را به نوع پایتون تبدیل کنیم. برای این کار فرض می کنیم می خواهیم یک فایل روی دیسک را بخوانیم (در اینجا خواندن فایل های json در پایتون) و اطلاعات آن را در یک متغیر پایتون ذخیره کنیم. فرض می کنیم که محتوای json همین مطلب را در یک فایل با نام دلخواه ذخیره کرده اید.
اولین گام برای خواندن فایل json ضمیمه کردن ماژول json است. سپس توسط تابع ()open فایل حاوی داده های json را می خوانیم. دلیل استفاده از تابع ()open این است که در واقع می خواهیم یک توصیفگر فایل (file descriptor) به فایل json ایجاد شود.
همانطور که متد ()dumps شی پایتون را تبدیل به فرمت json (یا شی json) می کند، متد ()loads عملیات عکس آنرا انجام می دهد. در کد زیر توسط این متد محتوای فایلی که متغیر fd به آن اشاره می کند، خوانده می شود. اگر به خروجی دقت کنید، خواهید دید متغیر data از نوع دیکشنری است.
چون خروجی تابع ()load به صورت دیکشنری است، پس می توانیم از طریق نام کلید به محتوای دیکشنری دسترسی داشته باشیم. با توجه به خروجی شکل بالا، دستورهای زیر مقادیر کلیدهای مختلف را نشان می دهند. همانطور که از شکل زیر مشخص است، وضعیت هوای تهران صاف (Clear) است.
# decoding
def getJsonFileContent(pathnane):
with open(pathnane, 'r') as fd:
return json.load(fd)
pathnane = '/Users/amirnami/weather.json'
data = getJsonFileContent(pathnane)
print(type(data))
print('----------------------')
print(data)
print(data['weather'])
print('----------------------')
print("weather status is
{}".format(data['weather'][0]['main']))
تفاوت متد ها ()load و ()loads
در مثال بالا از متد ()load استفاده کردیم. این متد به عنوان ورودی یک file descriptor به یک فایل با محتوای json را دریافت می کند و سپس محتوای درون فایل را به متغیری از نوع دیکشنری تبدیل می کند. در مقابل متد ()loads وجود دارد که برای کار با ورودی رشته است. متد ()loads به جای دریافت file descriptor، یک شی را دریافت و محتوای آن را تبدیل به نوع دیکشنری می کند.
نوشتن محتوای json بر روی فایل
نخستین گام برای ایجاد محتوای json توسط متد ()dumps است. همانطور که گفتیم متد ()dumps یک دیکشنری را دریافت و سپس آن را به شی json تبدیل می کند ولی متد ()dump محتوای یک فایل را خوانده و تبدیل به شی json می کند. در مثال زیر می خواهیم مقدار یک آرایه از دیکشنری ها را درون یک فایل به نام new_json_data.json ذخیره کنیم.
names = [
{'name' : 'amir', 'age' : 34},
{'name' : 'ali', 'age' : 31},
]
with open('new_json_data.json', 'w') as fd:
json.dump(names, fd, indent=4)
خواندن محتوای json از روی منابع (URL) اینترنت
خواندن محتوای json از روی اینترنت شبیه به خواندن از روی فایل است، با این تفاوت که دیگر نمی توانیم توسط تابع ()open فایل را باز کنیم بلکه باید از ماژول دیگری برای این کار استفاده کنیم. برای مثال می خواهیم از طریق سایت https://httpbin.org/ip که توسط پایتون و فریم ورک Flask نوشته شده است، آدرس IP عمومی که ISP در اختیار ما قرار می دهد را پیدا کنید. این نوع از خواندن فایل ها بیشتر برای افرادی است که با استفاده از پایتون طراحی سایت انجام می دهند یا قصد دارند خزنده های وب را با پایتون ایجاد کنند. در پکیج جامع طراحی سایت نیز به صورت کامل طراحی سایت با پایتون آموزش داشته شده است و علاوه بر بک اند، بخش فرانت اند نیز مورد توجه قرار میگیرد.
from urllib.request import urlopen
url = 'https://httpbin.org/ip'
response = urlopen(url)
ip
= json.loads(response.read().decode())
print('My IP Address is {}'.format(ip))
در قطعه کد بالا ابتدا از متد ()urlopen از ماژول urllib.request برای خواندن محتوای آدرس ذخیره شده در متغیری به نام url استفاده کرده ایم و خروجی را در متغیر جدیدی به نام response ذخیره کرده ایم. سپس توسط متد ()loads از ماژول json محتوای متغیر درون response را خوانده و در متغیر ip ذخیره کرده ایم. توجه کنید که متغیر ip از نوع دیکشنری است. در نهایت مقدار محتوای متغیر ip را نشان داده ایم.
همانطور که از شکل بالا مشخص است متغیر ip دارای یک کلید به نام origin است که می توانیم با دسترسی به آن، آدرس IP را پیدا کنیم، بنابراین باید از دستور زیر برای دسترسی به مقدار کلید origin استفاده کنیم.
print('My IP Address is {}'.format(ip['origin']))
python_json.ipynb به فرمت ipynb برای نمایش در jupyter notebook
درباره مدیریت
من عاشق برنامه نویسی و تکنولوژی هستم و 10 سال در این زمینه مشغول به فعالیت هستم و پروژه های مختلفی رو در زمینه های سایت و شبکه های کامپیوتری و امنیت اطلاعات انجام دادم و در حال حاضر مدیر و موسس شرکت انفورماتیک طراحی پایا آنوش هستم که در زمینه ی طراحی سایت و سیستم های هوشمند و برقراری امنیت اطلاعات سیستم های کامپیوتری و همچنین آموزش فعالیت دارد و میخواهم هر آنچه که در طی این 10 سال یاد گرفتم و تجربه کردم رو با شما به اشتراک بگذارم.
نوشته های بیشتر از مدیریت
دیدگاهتان را بنویسید