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

سرور مجازی NVMe

خواندن و نوشتن JSON در یک فایل در پایتون

0 51
زمان لازم برای مطالعه: 7 دقیقه


معرفی

در این راهنما، روش خواندن و نوشتن داده‌های JSON از و روی یک فایل در پایتون را با استفاده از json مدول.

JSON (نشان‌گذاری شی جاوا اسکریپت) یک فرمت بسیار محبوب برای سریال سازی داده ها است، با توجه به اینکه چقدر به طور کلی کاربردی و سبک است – در حالی که نسبتاً انسان پسند است. مهم‌تر از همه، این به طور گسترده در دنیای توسعه وب استفاده می‌شود، جایی که احتمالاً با اشیاء سریال‌سازی شده JSON که از آن ارسال می‌شوند، مواجه خواهید شد. REST APIها، پیکربندی برنامه یا حتی ذخیره سازی ساده داده ها.

با توجه به شیوع آن، خواندن و تجزیه فایل های JSON (یا رشته ها) بسیار رایج است و نوشتن JSON برای ارسال به همان اندازه رایج است. در این راهنما – ما نگاهی به روش استفاده از اهرم خواهیم انداخت json ماژول خواندن و نوشتن JSON در پایتون.

نوشتن JSON در یک فایل با پایتون با json.dump() و json.dumps()

برای نوشتن محتویات JSON در یک فایل در پایتون – می توانیم استفاده کنیم json.dump() و json.dumps(). اینها هستند روش های جداگانه و به نتایج متفاوتی برسید:

  • json.dumps() – یک شی را به فرمت JSON سریال می کند رشته
  • json.dump() – یک شی را در یک جریان JSON برای ذخیره در فایل ها یا سوکت ها سریال کرد

توجه داشته باشید: “s” در “dumps” در واقع کوتاه است “dump رشته”.

فرمت طبیعی JSON شبیه a است نقشه در علوم کامپیوتر – نقشه ای از key-value جفت در پایتون، a فرهنگ لغت یک پیاده سازی نقشه است، بنابراین ما به طور طبیعی قادر خواهیم بود JSON را به طور صادقانه از طریق a نشان دهیم dict. یک فرهنگ لغت می‌تواند شامل دیکشنری‌های تودرتو، آرایه‌ها، بولی‌ها یا دیگر انواع ابتدایی مانند اعداد صحیح و رشته‌ها باشد.

:::

توجه داشته باشید: ساخته شده در json بسته چندین روش راحت ارائه می دهد که به ما امکان می دهد بین JSON و دیکشنری ها تبدیل کنیم.

:::

که گفته شد، اجازه دهید import را json ماژول، یک دیکشنری با مقداری داده تعریف کنید و سپس آن را قبل از ذخیره در یک فایل به JSON تبدیل کنید:

import json

data = {
    'employees' : (
        {
            'name' : 'John Doe',
            'department' : 'Marketing',
            'place' : 'Remote'
        },
        {
            'name' : 'Jane Doe',
            'department' : 'Software Engineering',
            'place' : 'Remote'
        },
        {
            'name' : 'Don Joe',
            'department' : 'Software Engineering',
            'place' : 'Office'
        }
    )
}


json_string = json.dumps(data)
print(json_string)

این نتیجه در:

{'employees': ({'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'})}

در اینجا، ما یک فرهنگ لغت ساده با چند عدد داریم employees، که هر کدام دارای یک name، department و place. را dumps() عملکرد از json مدول زباله ها یک فرهنگ لغت به محتویات JSON، و a را برمی گرداند رشته JSON.

پس از سریال سازی، ممکن است تصمیم بگیرید که آن را به سرویس دیگری بفرستید که آن را از سریال خارج کند، یا مثلاً آن را ذخیره کند. برای ذخیره این رشته JSON در یک فایل، ما به سادگی یک فایل را در حالت نوشتن باز می کنیم و آن را یادداشت می کنیم. اگر نمی خواهید داده ها را در یک متغیر مستقل برای استفاده بعدی استخراج کنید و فقط می خواهید dump آن را در یک فایل، می توانید از آن بگذرید dumps() عملکرد و استفاده dump() بجای:


with open('json_data.json', 'w') as outfile:
    outfile.write(json_string)


with open('json_data.json', 'w') as outfile:
    json.dump(json_string, outfile)

هر شی فایل مانندی را می توان به آرگومان دوم ارسال کرد dump() عملکرد، حتی اگر یک فایل واقعی نباشد. یک مثال خوب برای این می‌تواند یک سوکت باشد که می‌توان آن را باز کرد، بسته کرد و روی یک فایل نوشت.

خواندن JSON از یک فایل با پایتون با json.load() و json.loads()

نگاشت بین محتوای فرهنگ لغت و یک رشته JSON ساده است، بنابراین تبدیل بین این دو آسان است. همان منطق با dump() و dumps() اعمال می شود load() و loads(). بسیار شبیه به json.dumps()، json.loads() تابع یک رشته JSON را می پذیرد و آن را به دیکشنری تبدیل می کند، در حالی که json.load() به شما امکان می دهد در یک فایل بارگذاری کنید:

import json

with open('json_data.json') as json_file:
    data = json.load(json_file)
    print(data)

این نتیجه در:

{'employees': ({'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'})}

متناوبا، بیایید یک رشته JSON را در فرهنگ لغت بخوانیم:

import json

python_dictionary = json.loads(json_string)
print(python_dictionary)

که همچنین منجر به:

{'employees': ({'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'})}

این یکی به ویژه برای تجزیه پاسخ های REST API که JSON ارسال می کنند مفید است. این داده‌ها به‌عنوان یک رشته به شما می‌آیند، که سپس می‌توانید به آن ارسال کنید json.loads() به طور مستقیم، و شما یک فرهنگ لغت بسیار قابل مدیریت برای کار با آن دارید!

مرتب سازی، چاپ زیبا، جداکننده و رمزگذاری

هنگام سریال‌سازی داده‌های خود به JSON با پایتون، فرمت استاندارد با هدف به حداقل رساندن حافظه مورد نیاز برای انتقال پیام‌ها چندان قابل خواندن نیست زیرا فضاهای خالی حذف می‌شوند. در حالی که این رفتار ایده‌آل برای انتقال داده است (کامپیوترها به خوانایی اهمیت نمی‌دهند، اما به اندازه اهمیت می‌دهند) – گاهی اوقات ممکن است لازم باشد تغییرات کوچکی ایجاد کنید، مانند اضافه کردن فضای خالی برای خواندن آن توسط انسان.

توجه داشته باشید: json.dump()/json.dumps() و json.load()/json.loads() همه چند گزینه برای قالب بندی ارائه می دهند.

چاپ زیبا JSON در پایتون

خوانایی JSON برای انسان (معروف به “چاپ زیبا”) به آسانی ارسال یک مقدار صحیح برای indent پارامتر:

import json
data = {'people':({'name': 'Scott', 'website': 'rasanegar.com', 'from': 'Nebraska'})}
print(json.dumps(data, indent=4))

این یک تورفتگی 4 فاصله ای ایجاد می کند روی هر بلوک منطقی جدید:

{
    "people": (
        {
            "website": "rasanegar.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    )
}

گزینه دیگر استفاده از ابزار خط فرمان است – json.tool. با آن، شما می توانید زیباprint JSON در خط فرمان بدون اینکه روی رشته ارسال شده تأثیر بگذارد و فقط بر روش نمایش آن تأثیر بگذارد روی لوله خروجی استاندارد:

$ echo '{"people":({"name":"Scott", "website":"rasanegar.com", "from":"Nebraska"})}' | python -m json.tool
{
    "people": (
        {
            "name": "Scott",
            "website": "rasanegar.com"
            "from": "Nebraska",
        }
    )
}

مرتب سازی اشیاء JSON بر اساس کلیدها

به زبان JSON:

“یک شیء مجموعه ای نامرتب از جفت های نام/مقدار است.”

دستور کلید تضمین نشده است، اما ممکن است لازم باشد دستور کلید را اجرا کنید. برای رسیدن به سفارش، می توانید پاس کنید True به sort_keys گزینه هنگام استفاده json.dump() یا json.dumps():

import json
data = {'people':({'name': 'Scott', 'website': 'rasanegar.com', 'from': 'Nebraska'})}
print(json.dumps(data, sort_keys=True, indent=4))

این نتیجه در:

{
    "people": (
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "rasanegar.com"
        }
    )
}

متن ASCII و رمزگذاری

به صورت پیش فرض، json.dump() و json.dumps() اطمینان حاصل می کند که متن در فرهنگ لغت پایتون داده شده با رمزگذاری اسکی است. اگر کاراکترهای غیر ASCII وجود داشته باشند، همانطور که در مثال زیر نشان داده شده است، به طور خودکار از آنها خارج می شوند:

import json
data = {'item': 'Beer', 'cost':'£4.00'}
jstr = json.dumps(data, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "\u00a34.00"
}

این همیشه قابل قبول نیست و در بسیاری از موارد ممکن است بخواهید کاراکترهای یونیکد خود را بدون تغییر نگه دارید. برای انجام این کار، تنظیم کنید ensure_ascii گزینه ای به False:

jstr = json.dumps(data, ensure_ascii=False, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "£4.00"
}

از انواع داده های کلید سفارشی صرف نظر کنید

اگر یک کلید در فرهنگ لغت شما از نوع غیر ابتدایی باشد (str، int، float، bool یا None)، آ TypeError هنگامی که سعی می کنید محتویات JSON را در یک فایل تخلیه کنید، افزایش می یابد. می توانید از طریق این کلیدها رد شوید skipkeys بحث و جدل:

jstr = json.dumps(data, skipkeys=True)

فعال و غیرفعال کردن بررسی دایره ای

اگر یک ویژگی از یک شی JSON به خود ارجاع دهد، یا شی دیگری که به شی والد ارجاع می دهد – یک JSON بی نهایت بازگشتی ایجاد می شود. بازگشت بی نهایت معمولاً منجر به تخصیص سریع حافظه می شود تا زمانی که حافظه دستگاه تمام شود، و در مورد تخلیه JSON، یک RecursionError افزایش یافته و تخلیه متوقف شده است.

این توسط تنظیم می شود check_circular پرچم، که است True به طور پیش فرض، و از مشکلات احتمالی هنگام نوشتن وابستگی های دایره ای جلوگیری می کند. برای خاموش کردن آن، می‌توانید آن را روی «False» تنظیم کنید:

jstr = json.dumps(data, check_circular=False)

با این حال توجه داشته باشید که این است بسیار توصیه نمیشود.

فعال و غیرفعال کردن NaNs

مقادیر NaN، مانند -inf، inf و nan ممکن است در اشیایی که می‌خواهید سریال‌سازی یا سریال‌زدایی کنید، نفوذ کند. استاندارد JSON اجازه نمی دهد برای مقادیر NaN، اما آنها همچنان دارای مقادیر منطقی هستند که ممکن است بخواهید در یک پیام منتقل کنید. از سوی دیگر – ممکن است بخواهید آن مقادیر NaN را اعمال کنید نیستند منتقل می شود، و به جای آن یک استثنا مطرح می کند. را allow_nan پرچم تنظیم شده است True به طور پیش‌فرض، و به شما اجازه می‌دهد مقادیر NaN را سریال‌سازی و غیرمسلسل‌سازی کنید، و آنها را با معادل‌های جاوا اسکریپت جایگزین کنید.Infinity، -Infinity و NaN).

اگر پرچم را روی False در عوض – به فرمت کاملاً استاندارد شده JSON تغییر حالت می دهید که باعث افزایش a می شود ValueError اگر اشیاء شما دارای ویژگی هایی با این مقادیر هستند:

jstr = json.dumps(data, allow_nan=False)

تغییر جداکننده ها

در JSON، کلیدها با دو نقطه از مقادیر جدا می شوند (:) و موارد با کاما از یکدیگر جدا می شوند (,):

key1:value1,
key2:value2

جداکننده پیش فرض برای خواندن و نوشتن JSON در پایتون است (', ', ': ') با فضاهای خالی بعد از کاما و دو نقطه می‌توانید این موارد را تغییر دهید تا فضاهای سفید را رد کنید و در نتیجه JSON را کمی فشرده‌تر کنید، یا جداکننده‌ها را به‌طور کامل با سایر کاراکترهای خاص برای نمایشی متفاوت تغییر دهید:


jstr = json.dumps(data, separators=(',', ':'))

مشکلات سازگاری با پایتون 2

اگر از نسخه قدیمی Python (2.x) استفاده می کنید – ممکن است با یک مواجه شوید TypeError در حالی که تلاش می کند dump محتویات JSON در یک فایل. یعنی، اگر محتویات حاوی یک کاراکتر غیر ASCII باشند، a TypeError ظهور کرده، حتی اگر هنگام استفاده از آرگومان رمزگذاری را پاس می کنید json.dump() روش:


with open('json_data.json', 'w', encoding='utf-8') as outfile:
    json.dump(json_string, outfile, ensure_ascii=False)

اگر با این edge-case مواجه شدید که در نسخه‌های بعدی پایتون برطرف شده است – استفاده کنید json.dumps() در عوض، و به جای پخش مستقیم محتوا در فایل، محتوای رشته را در یک فایل بنویسید.

نتیجه

در این راهنما شما را با json.dump()، json.dumps()، json.load()، و json.loads() روش‌هایی که به سریال‌سازی و جداسازی رشته‌های JSON کمک می‌کنند.

سپس نگاهی به این انداختیم که چگونه می توانید اشیاء JSON را مرتب کنید.print آنها، کدگذاری را تغییر دهید، انواع داده های کلید سفارشی را رد کنید، بررسی های دایره ای و مجاز بودن NaN ها را فعال یا غیرفعال کنید، همچنین روش تغییر جداکننده ها برای سریال سازی و سریال زدایی.

با توجه به اینکه JSON یکی از محبوب‌ترین راه‌ها برای سریال‌سازی داده‌های ساخت‌یافته است، احتمالاً باید اغلب با آن تعامل داشته باشید، مخصوصاً هنگام کار روی برنامه های کاربردی وب پایتون json ماژول یک راه عالی برای شروع است، اگرچه احتمالاً آن را خواهید یافت simplejson یک جایگزین عالی دیگر است که بسیار کمتر سختگیرانه است روی نحو JSON.

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



منتشر شده در 1403-01-02 20:55:04

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

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

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