Python-এ JSON থেকে CSV — DictWriter ও pandas উদাহরণ
বিনামূল্যে অনলাইন JSON থেকে CSV সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।
JSON থেকে CSV অনলাইনে ব্যবহার করুন →প্রায় প্রতিটি ডেটা পাইপলাইনে একই ধাপ আসে: একটি API JSON ফেরত দেয়, কিন্তু পরবর্তী কনজিউমার — স্প্রেডশিট, ইম্পোর্ট স্ক্রিপ্ট, বা Redshift COPY কমান্ড — CSV চায়। Python-এ JSON থেকে CSV রূপান্তর সহজ মনে হয়, যতক্ষণ না আপনি নেস্টেড অবজেক্ট, অসামঞ্জস্যপূর্ণ key, বা বিশেষ হ্যান্ডলিং প্রয়োজন এমন datetime মানের মুখোমুখি হন। Python আপনাকে দুটি শক্তিশালী পথ দেয়: শূন্য-নির্ভরতার স্ক্রিপ্টের জন্য বিল্ট-ইন json + csv মডিউল, এবং নেস্টেড ফ্ল্যাটেনিং ও বড় ডেটাসেটের জন্য pandas — অথবা কোড ছাড়া দ্রুত এককালীন রূপান্তরের জন্য অনলাইন JSON to CSV কনভার্টার। এই গাইডে উভয় পদ্ধতি শুরু থেকে শেষ পর্যন্ত কভার করা হয়েছে, চালানোযোগ্য Python 3.8+ উদাহরণ সহ।
- ✓csv.DictWriter শূন্য নির্ভরতায় dict-এর তালিকা CSV-তে রূপান্তর করে — পার্স করতে json.load() ব্যবহার করুন, তারপর writeheader() + writerows()।
- ✓Windows-এ ডেটা সারির মাঝে ফাঁকা সারি এড়াতে সবসময় newline="" দিয়ে CSV ফাইল খুলুন।
- ✓pd.json_normalize() to_csv() কল করার আগে নেস্টেড JSON ফ্ল্যাট DataFrame-এ ফ্ল্যাটেন করে — বহু-স্তর নেস্টিং স্বয়ংক্রিয়ভাবে হ্যান্ডেল করে।
- ✓DataFrame.to_csv()-এ index=False পাস করুন — ছাড়া pandas অবাঞ্ছিত সারি-নম্বর কলাম লেখে।
- ✓500 MB-এর বেশি ফাইলের জন্য, স্থির মেমরি ব্যবহারের জন্য csv.DictWriter-এর সাথে স্ট্রিমিং JSON পার্সিংয়ে ijson ব্যবহার করুন।
JSON থেকে CSV রূপান্তর কী?
JSON থেকে CSV রূপান্তর JSON অবজেক্টের একটি অ্যারেকে সারণী বিন্যাসে রূপান্তরিত করে যেখানে প্রতিটি অবজেক্ট একটি সারি এবং প্রতিটি key একটি কলাম হেডার হয়। JSON শ্রেণিবদ্ধ — অবজেক্ট অনির্দিষ্টভাবে গভীরে নেস্ট হতে পারে। CSV সমতল — প্রতিটি মান একটি সারি-কলাম গ্রিডে থাকে। রূপান্তর ভালোভাবে কাজ করে যখন প্রতিটি অবজেক্ট একই শীর্ষ-স্তরের key শেয়ার করে। নেস্টেড অবজেক্ট, অ্যারে এবং অসামঞ্জস্যপূর্ণ key-ই জটিলতা তৈরি করে। কাঁচা ডেটা একই থাকে; শুধু কাঠামো পরিবর্তন হয়।
[{"order_id":"ord_91a3","total":149.99,"status":"shipped"},
{"order_id":"ord_b7f2","total":34.50,"status":"pending"}]order_id,total,status ord_91a3,149.99,shipped ord_b7f2,34.50,pending
csv.DictWriter — pandas ছাড়া JSON থেকে CSV রূপান্তর
csv মডিউল প্রতিটি Python ইনস্টলেশনের সাথে আসে। কোনো pip install নেই, ভার্চুয়াল এনভায়রনমেন্টের ঝামেলা নেই। csv.DictWriter dictionary-র একটি তালিকা নিয়ে প্রতিটিকে CSV সারি হিসেবে লেখে, dict key-গুলোকে কলাম হেডারে ম্যাপ করে। fieldnames প্যারামিটার কলামের ক্রম এবং কোন key অন্তর্ভুক্ত হবে তা উভয়ই নিয়ন্ত্রণ করে।
import json
import csv
# নমুনা JSON ডেটা — অর্ডার অবজেক্টের একটি অ্যারে
json_string = """
[
{"order_id": "ord_91a3", "product": "Wireless Keyboard", "quantity": 2, "unit_price": 74.99},
{"order_id": "ord_b7f2", "product": "USB-C Hub", "quantity": 1, "unit_price": 34.50},
{"order_id": "ord_c4e8", "product": "Monitor Stand", "quantity": 3, "unit_price": 29.95}
]
"""
records = json.loads(json_string)
with open("orders.csv", "w", newline="", encoding="utf-8") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=records[0].keys())
writer.writeheader()
writer.writerows(records)
# orders.csv:
# order_id,product,quantity,unit_price
# ord_91a3,Wireless Keyboard,2,74.99
# ord_b7f2,USB-C Hub,1,34.50
# ord_c4e8,Monitor Stand,3,29.95open()-এ newline="" আর্গুমেন্টটি Windows-এ ঐচ্ছিক নয়। এটি ছাড়া, ডবল ক্যারেজ রিটার্ন পাবেন — যা Excel-এ প্রতিটি ডেটা সারির মাঝে ফাঁকা সারি হিসেবে দেখা যায়। macOS ও Linux-এ এটি নিরীহ, তাই সবসময় এটি অন্তর্ভুক্ত করুন।
উপরের কোডে স্ট্রিংয়ের জন্য json.loads() ব্যবহার করা হয়েছে। ফাইল হ্যান্ডেল থেকে পড়ার সময় json.load() (শেষে s ছাড়া) ব্যবহার করুন। এটি মানুষকে প্রায়ই বিভ্রান্ত করে — একটি স্ট্রিং পড়ে, অপরটি ফাইল অবজেক্ট পড়ে।
import json
import csv
with open("server_metrics.json", encoding="utf-8") as jf:
metrics = json.load(jf) # ফাইল অবজেক্টের জন্য json.load()
# স্পষ্ট fieldnames কলামের ক্রম নিয়ন্ত্রণ করে
columns = ["timestamp", "hostname", "cpu_percent", "memory_mb", "disk_io_ops"]
with open("server_metrics.csv", "w", newline="", encoding="utf-8") as cf:
writer = csv.DictWriter(cf, fieldnames=columns, extrasaction="ignore")
writer.writeheader()
writer.writerows(metrics)
# শুধুমাত্র পাঁচটি নির্দিষ্ট কলাম ঠিক সেই ক্রমে আসবেextrasaction="ignore" সেট করলে dict-এ থাকা যেসব key আপনার fieldnames তালিকায় নেই সেগুলো নীরবে বাদ দেওয়া হয়। ডিফল্ট হলো "raise", যা কোনো dict-এ অপ্রত্যাশিত key থাকলে ValueError ছোড়ে। অপ্রত্যাশিত বিষয়ে আপনার সহনশীলতার সাথে যেটি মানানসই সেটি বেছে নিন।
csv.DictWriter বনাম csv.writer: DictWriter স্বয়ংক্রিয়ভাবে dict key-গুলোকে কলাম পজিশনে ম্যাপ করে। csv.writer কাঁচা তালিকা সারি হিসেবে লেখে — আপনি নিজেই কলামের ক্রম নিয়ন্ত্রণ করেন। JSON রেকর্ড ইতিমধ্যে dictionary হওয়ায় JSON-থেকে-CSV-তে DictWriter প্রায় সবসময় সঠিক পছন্দ।Python-এর csv মডিউলে তিনটি নামযুক্ত ডায়ালেক্ট রয়েছে: excel (কমা ডিলিমিটার, CRLF লাইন এন্ডিং — ডিফল্ট), excel-tab (ট্যাব ডিলিমিটার, CRLF এন্ডিং), এবং unix (LF লাইন এন্ডিং, সব নন-নিউমেরিক ফিল্ড কোট করে)। ডায়ালেক্টের নামটি csv.DictWriter-এ dialect আর্গুমেন্ট হিসেবে পাস করুন। আপনার টার্গেট সিস্টেমে অস্বাভাবিক কোটিং বা ডিলিমিটার নিয়ম থাকলে csv.register_dialect() দিয়ে কাস্টম ডায়ালেক্ট সংজ্ঞায়িত করতে পারেন। বেশিরভাগ JSON-থেকে-CSV ওয়ার্কফ্লোতে excel ডায়ালেক্টই সঠিক, তবে awk বা sort-এর মতো POSIX টুল দিয়ে প্রক্রিয়া করা হবে এমন ফাইল লেখার সময় unix-এ পরিবর্তন করুন।
কাস্টম টাইপ হ্যান্ডেলিং: datetime, UUID এবং Decimal
API থেকে আসা JSON প্রায়ই ISO স্ট্রিং হিসেবে তারিখ, হাইফেনযুক্ত স্ট্রিং হিসেবে UUID, এবং float হিসেবে আর্থিক মান ধারণ করে। CSV লেখার আগে প্রক্রিয়াকরণের জন্য এগুলো Python অবজেক্টে পার্স করলে আবার স্ট্রিংয়ে রূপান্তর করতে হবে। csv মডিউল প্রতিটি মানে str() কল করে, তাই বেশিরভাগ টাইপ কাজ করে। কিন্তু datetime অবজেক্ট অগোছালো ডিফল্ট স্ট্রিং উপস্থাপনা তৈরি করে, এবং Decimal মান বৈজ্ঞানিক নোটেশন এড়াতে স্পষ্ট ফরম্যাটিং প্রয়োজন।
import json
import csv
from datetime import datetime, timezone
from decimal import Decimal
from uuid import UUID
# Python টাইপ সহ পার্স করা API রেসপন্সের সিমুলেশন
transactions = [
{
"txn_id": UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
"created_at": datetime(2026, 3, 15, 9, 30, 0, tzinfo=timezone.utc),
"amount": Decimal("1249.99"),
"currency": "USD",
"merchant": "CloudHost Inc.",
},
{
"txn_id": UUID("b2c3d4e5-f6a7-8901-bcde-f12345678901"),
"created_at": datetime(2026, 3, 15, 14, 12, 0, tzinfo=timezone.utc),
"amount": Decimal("87.50"),
"currency": "EUR",
"merchant": "DataSync GmbH",
},
]
def prepare_row(record: dict) -> dict:
"""অ-স্ট্রিং টাইপগুলো CSV-বান্ধব স্ট্রিংয়ে রূপান্তর করুন।"""
return {
"txn_id": str(record["txn_id"]),
"created_at": record["created_at"].isoformat(),
"amount": f"{record['amount']:.2f}",
"currency": record["currency"],
"merchant": record["merchant"],
}
with open("transactions.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["txn_id", "created_at", "amount", "currency", "merchant"])
writer.writeheader()
for txn in transactions:
writer.writerow(prepare_row(txn))
# transactions.csv:
# txn_id,created_at,amount,currency,merchant
# a1b2c3d4-e5f6-7890-abcd-ef1234567890,2026-03-15T09:30:00+00:00,1249.99,USD,CloudHost Inc.
# b2c3d4e5-f6a7-8901-bcde-f12345678901,2026-03-15T14:12:00+00:00,87.50,EUR,DataSync GmbHএখানে prepare_row() ফাংশনটি সঠিক পদ্ধতি। csv.DictWriter-কে কাস্টম টাইপ সম্পর্কে শেখানোর চেষ্টার পরিবর্তে, লেখার আগে প্রতিটি রেকর্ডকে স্ট্রিংয়ে নর্মালাইজ করুন। datetime অবজেক্টে str()-এর উপর নির্ভর না করে স্পষ্টভাবে .isoformat() কল করাই পছন্দনীয় — আউটপুট ফরম্যাট আরো অনুমানযোগ্য, এবং ডাউনস্ট্রিম পার্সার ISO 8601 নির্ভরযোগ্যভাবে হ্যান্ডেল করে।
Decimal মান পাস করলে, অত্যন্ত ছোট বা বড় সংখ্যা বৈজ্ঞানিক নোটেশনে রেন্ডার হতে পারে (যেমন, 1.5E+7)। আর্থিক ডেটা CSV-তে লেখার সময় সবসময় Decimal-এ স্পষ্ট f-string যেমন f"{value:.2f}" দিয়ে ফরম্যাট করুন।অনেক কাস্টম টাইপ সহ পাইপলাইনের জন্য বিকল্প প্যাটার্ন হলো json.JSONEncoder প্রসারিত করা। এটি সাবক্লাস করুন, default() মেথড ওভাররাইড করে প্রতিটি কাস্টম টাইপের জন্য JSON-সিরিয়ালাইজযোগ্য মান ফেরত দিন, তারপর সাবক্লাসটি json.dumps()-এ cls আর্গুমেন্ট হিসেবে পাস করুন। CSV-তে লেখার আগে কাস্টম এনকোডারের মাধ্যমে পুনরায় এনকোড করলে প্রতি-সারি prepare_row() কল ছাড়াই এক ধাপে সব টাইপ নর্মালাইজ হয়। উপরে দেখানো prepare_row() প্যাটার্ন এককালীন স্ক্রিপ্টের জন্য সহজ; JSONEncoder সাবক্লাস পদ্ধতি একই ডোমেইন মডেল বহু পাইপলাইন স্তর বা মাইক্রোসার্ভিসে শেয়ার করা হলে ভালো স্কেল করে।
csv.DictWriter প্যারামিটার রেফারেন্স
সম্পূর্ণ কনস্ট্রাক্টর সিগনেচার হলো csv.DictWriter(f, fieldnames, restval="", extrasaction="raise", dialect="excel", **fmtparams)। এদের বেশিরভাগের যুক্তিসঙ্গত ডিফল্ট আছে। আপনি আসলে যেগুলো পরিবর্তন করবেন সেগুলো হলো fieldnames, delimiter, এবং extrasaction।
pandas — DataFrame দিয়ে JSON থেকে CSV রূপান্তর
আপনি যদি ইতিমধ্যে pandas-ভারী কোডবেসে কাজ করছেন, বা আপনার JSON-এ নেস্টেড অবজেক্ট থাকে যেগুলো ফ্ল্যাটেন করতে হবে, pandas পদ্ধতিতে stdlib সংস্করণের চেয়ে উল্লেখযোগ্যভাবে কম কোড লাগে। ট্রেডঅফ: pandas একটি ~30 MB নির্ভরতা। একটি সাময়িক স্ক্রিপ্টের জন্য, এটি ঠিক আছে। প্রোডাকশনে পাঠানো Docker ইমেজের জন্য, stdlib পদ্ধতি হালকা রাখে।
import pandas as pd
# JSON অ্যারে সরাসরি DataFrame-এ পড়ুন
df = pd.read_json("warehouse_inventory.json")
# CSV-তে লিখুন — index=False স্বয়ংক্রিয়-তৈরি সারি নম্বর প্রতিরোধ করে
df.to_csv("warehouse_inventory.csv", index=False)
# ব্যস। দুই লাইন। pandas স্বয়ংক্রিয়ভাবে কলামের টাইপ অনুমান করে।index=False ফ্ল্যাগটি এমন জিনিস যা আপনি প্রতিবার খুঁজে দেখেন। এটি ছাড়া, pandas আপনার CSV-র প্রথম কলাম হিসেবে 0, 1, 2, ... কলাম লেখে। কেউ সেটা চায় না।
json_normalize দিয়ে নেস্টেড JSON ফ্ল্যাটেন করা
বাস্তব API রেসপন্স খুব কমই ফ্ল্যাট হয়। অর্ডারে শিপিং ঠিকানা থাকে, ব্যবহারকারীতে নেস্টেড পছন্দ থাকে, টেলিমেট্রি ইভেন্টে নেস্টেড মেটাডেটা থাকে। pd.json_normalize() নেস্টেড dictionary ঘুরে ডট-বিভাজক নামসহ কলামে ফ্ল্যাটেন করে।
import json
import pandas as pd
api_response = """
[
{
"order_id": "ord_91a3",
"placed_at": "2026-03-15T09:30:00Z",
"customer": {
"name": "Sarah Chen",
"email": "s.chen@example.com",
"tier": "premium"
},
"shipping": {
"method": "express",
"address": {
"city": "Portland",
"state": "OR",
"zip": "97201"
}
},
"total": 299.95
},
{
"order_id": "ord_b7f2",
"placed_at": "2026-03-15T14:12:00Z",
"customer": {
"name": "James Park",
"email": "j.park@example.com",
"tier": "standard"
},
"shipping": {
"method": "standard",
"address": {
"city": "Austin",
"state": "TX",
"zip": "73301"
}
},
"total": 87.50
}
]
"""
orders = json.loads(api_response)
# json_normalize নেস্টেড dict ফ্ল্যাটেন করে — sep ডিলিমিটার নিয়ন্ত্রণ করে
df = pd.json_normalize(orders, sep="_")
df.to_csv("flat_orders.csv", index=False)
# ফলাফলের কলামসমূহ:
# order_id, placed_at, customer_name, customer_email, customer_tier,
# shipping_method, shipping_address_city, shipping_address_state,
# shipping_address_zip, totalsep="_" প্যারামিটার নেস্টেড key নামগুলো কীভাবে যুক্ত হবে তা নিয়ন্ত্রণ করে। ডিফল্ট হলো ".", যা customer.name-এর মতো কলাম তৈরি করে। কলামের নামে ডট SQL ইম্পোর্ট ও কিছু স্প্রেডশিট ফর্মুলায় সমস্যা করে বলে আন্ডারস্কোর পছন্দনীয়।
নেস্টেড key-এর নিচে রেকর্ড অ্যারে মোড়ানো API রেসপন্সের জন্য record_path প্যারামিটার ব্যবহার করুন। রেসপন্স যদি {"data": {"orders": [...]}}-এর মতো দেখায়, সঠিক তালিকায় যেতে record_path=["data", "orders"] পাস করুন। ঐচ্ছিক meta প্যারামিটার নেস্টেড রেকর্ডের পাশাপাশি প্যারেন্ট-স্তরের ফিল্ড টানতে দেয় — রেসপন্সে শীর্ষ-স্তরের পেজিনেশন তথ্য (পেজ নম্বর, মোট সংখ্যা) থাকলে প্রতিটি সারিতে কলাম হিসেবে রাখতে দরকারী। একসাথে, record_path এবং meta কাস্টম প্রিপ্রসেসিং ছাড়াই বেশিরভাগ বাস্তব-দুনিয়ার নেস্টেড API রেসপন্সের আকৃতি হ্যান্ডেল করে।
DataFrame.to_csv() প্যারামিটার রেফারেন্স
DataFrame.to_csv()-এ ২০টিরও বেশি প্যারামিটার রয়েছে। JSON-থেকে-CSV ওয়ার্কফ্লোতে এগুলোই গুরুত্বপূর্ণ।
import pandas as pd
df = pd.read_json("telemetry_events.json")
# স্পষ্ট এনকোডিং ও অনুপস্থিত মান হ্যান্ডেলিং সহ TSV আউটপুট
df.to_csv(
"telemetry_events.tsv",
sep="\t",
index=False,
encoding="utf-8",
na_rep="NULL",
columns=["event_id", "timestamp", "source", "severity", "message"],
)
# শেল স্ক্রিপ্টে পাইপিংয়ের জন্য stdout-এ লিখুন
print(df.to_csv(index=False))
# স্ট্রিং হিসেবে ফেরত নিন (কোনো ফাইল লেখা হয় না)
csv_string = df.to_csv(index=False)
print(len(csv_string), "অক্ষর")ফাইল ও API রেসপন্স থেকে JSON-কে CSV-তে রূপান্তর
দুটি সবচেয়ে সাধারণ বাস্তব পরিস্থিতি: ডিস্কের ফাইল থেকে JSON পড়ে রূপান্তর করা, বা HTTP API থেকে JSON ফেচ করে ফলাফল CSV হিসেবে সংরক্ষণ করা। ডেভেলপমেন্টে এরর হ্যান্ডলিং ছাড়া কাজ চলে। প্রোডাকশনে, সেই পছন্দ রাত ২টার অ্যালার্ট হয়ে যায়। ফাইল নাও থাকতে পারে, API JSON-এর পরিবর্তে 4xx বা 5xx স্ট্যাটাস কোড ফেরত দিতে পারে, রেসপন্স বডি অ্যারের পরিবর্তে এরর অবজেক্ট হতে পারে, বা নেটওয়ার্ক টাইমআউটে JSON ছেঁটে যেতে পারে। নিচের প্যাটার্নগুলো এই সব ক্ষেত্রে স্পষ্টভাবে হ্যান্ডেল করে, ত্রুটি stderr-এ লগ করে, এবং সারির সংখ্যা ফেরত দেয় যাতে কলার শূন্য-সারির আউটপুট শনাক্ত করে সতর্ক করতে পারে।
ডিস্কের ফাইল — পড়ুন, রূপান্তর করুন, সংরক্ষণ করুন
import json
import csv
import sys
def json_file_to_csv(input_path: str, output_path: str) -> int:
"""অবজেক্টের অ্যারে ধারণকারী JSON ফাইল CSV-তে রূপান্তর করুন।
লেখা সারির সংখ্যা ফেরত দেয়।
"""
try:
with open(input_path, encoding="utf-8") as jf:
data = json.load(jf)
except FileNotFoundError:
print(f"Error: {input_path} not found", file=sys.stderr)
return 0
except json.JSONDecodeError as exc:
print(f"Error: invalid JSON in {input_path}: {exc.msg} at line {exc.lineno}", file=sys.stderr)
return 0
if not isinstance(data, list) or not data:
print(f"Error: expected a non-empty JSON array in {input_path}", file=sys.stderr)
return 0
# সমস্ত রেকর্ড জুড়ে অনন্য key সংগ্রহ করুন — অসামঞ্জস্যপূর্ণ স্কিমা হ্যান্ডেল করে
all_keys: list[str] = []
seen: set[str] = set()
for record in data:
for key in record:
if key not in seen:
all_keys.append(key)
seen.add(key)
with open(output_path, "w", newline="", encoding="utf-8") as cf:
writer = csv.DictWriter(cf, fieldnames=all_keys, restval="", extrasaction="ignore")
writer.writeheader()
writer.writerows(data)
return len(data)
rows = json_file_to_csv("deploy_logs.json", "deploy_logs.csv")
print(f"Wrote {rows} rows to deploy_logs.csv")HTTP API রেসপন্স — ফেচ ও রূপান্তর
import json
import csv
import urllib.request
import urllib.error
def api_response_to_csv(url: str, output_path: str) -> int:
"""REST API এন্ডপয়েন্ট থেকে JSON ফেচ করে CSV হিসেবে লিখুন।"""
try:
req = urllib.request.Request(url, headers={"Accept": "application/json"})
with urllib.request.urlopen(req, timeout=30) as resp:
if resp.status != 200:
print(f"Error: API returned status {resp.status}")
return 0
body = resp.read().decode("utf-8")
except urllib.error.URLError as exc:
print(f"Error: could not reach {url}: {exc.reason}")
return 0
try:
records = json.loads(body)
except json.JSONDecodeError as exc:
print(f"Error: API returned invalid JSON: {exc.msg}")
return 0
if not isinstance(records, list) or not records:
print("Error: expected a non-empty JSON array from the API")
return 0
with open(output_path, "w", newline="", encoding="utf-8") as cf:
writer = csv.DictWriter(cf, fieldnames=records[0].keys())
writer.writeheader()
writer.writerows(records)
return len(records)
rows = api_response_to_csv(
"https://api.internal.example.com/v2/deployments?status=completed",
"completed_deployments.csv",
)
print(f"Exported {rows} deployments to CSV")urllib ব্যবহার করে। যদি requests ইনস্টল থাকে,urllib অংশটি resp = requests.get(url, timeout=30); records = resp.json() দিয়ে প্রতিস্থাপন করুন — বাকি CSV লেখার কোড একই থাকবে।কমান্ড-লাইনে JSON থেকে CSV রূপান্তর
কখনো কখনো টার্মিনালে শুধু একটি one-liner দরকার। Python-এর -c ফ্ল্যাগ স্ক্রিপ্ট ফাইল তৈরি ছাড়াই দ্রুত রূপান্তর চালাতে দেয়। আরো জটিল রূপান্তরের জন্য, আগে ডেটা আকার দিতে jq-এর মধ্য দিয়ে পাইপ করুন, তারপর রূপান্তর করুন।
# Python one-liner: stdin থেকে JSON পড়ে, stdout-এ CSV লেখে cat orders.json | python3 -c " import json, csv, sys data = json.load(sys.stdin) w = csv.DictWriter(sys.stdout, fieldnames=data[0].keys()) w.writeheader() w.writerows(data) " # ফাইলে আউটপুট সংরক্ষণ করুন cat orders.json | python3 -c " import json, csv, sys data = json.load(sys.stdin) w = csv.DictWriter(sys.stdout, fieldnames=data[0].keys()) w.writeheader() w.writerows(data) " > orders.csv
# json2csv.py হিসেবে সংরক্ষণ করুন এবং চালান: python3 json2csv.py input.json -o output.csv
python3 -c "
import json, csv, argparse, sys
parser = argparse.ArgumentParser(description='Convert JSON array to CSV')
parser.add_argument('input', help='Path to JSON file')
parser.add_argument('-o', '--output', default=None, help='Output CSV path (default: stdout)')
parser.add_argument('-d', '--delimiter', default=',', help='CSV delimiter')
args = parser.parse_args()
with open(args.input) as f:
data = json.load(f)
out = open(args.output, 'w', newline='') if args.output else sys.stdout
writer = csv.DictWriter(out, fieldnames=data[0].keys(), delimiter=args.delimiter)
writer.writeheader()
writer.writerows(data)
if args.output:
out.close()
print(f'Wrote {len(data)} rows to {args.output}', file=sys.stderr)
" "$@"# csvkit ইনস্টল করুন: pip install csvkit
# jq ফিল্ড নির্বাচন ও ফ্ল্যাটেন করে, in2csv CSV ফরম্যাটিং হ্যান্ডেল করে
cat api_response.json | jq '[.[] | {id: .order_id, customer: .customer.name, total}]' | in2csv -f json > orders.csv
# Miller (mlr) JSON-থেকে-CSV-র আরেকটি বিকল্প
mlr --json2csv cat orders.json > orders.csvMiller (mlr) হলো একটি স্বতন্ত্র বাইনারি যা Python রানটাইম ছাড়াই JSON, CSV এবং TSV-কে প্রথম-শ্রেণীর ফরম্যাট হিসেবে সাপোর্ট করে। --json2csv ফ্ল্যাগ একটি পাসে JSON ইনপুট CSV-তে রূপান্তর করে, এবং আউটপুট লেখার আগে একই কমান্ডে ফিল্টার, সর্ট বা কলাম নামান্তরিত করতে Miller ভার্ব চেইন করতে পারেন। macOS-এ Homebrew দিয়ে ইনস্টল করুন (brew install miller) বা আপনার Linux প্যাকেজ ম্যানেজার দিয়ে। CI পাইপলাইনে Python পরিবেশ চালু না করে দ্রুত JSON-থেকে-CSV রূপান্তরের জন্য এটি বিশেষভাবে কার্যকর।
হাই-পারফরম্যান্স অপশন — pyarrow সহ pandas
কোটি কোটি সারির ডেটাসেটের জন্য, pyarrow ব্যাকএন্ড সহ pandas ডিফল্টের চেয়ে উল্লেখযোগ্যভাবে দ্রুত পড়ে এবং লেখে। C-ব্যাকড Arrow ইঞ্জিন কলামার ডেটা Python-এর সারি-দ-সারি csv মডিউলের চেয়ে আরো দক্ষতার সাথে প্রক্রিয়া করে। API একই থাকে — শুধু engine প্যারামিটার সেট করুন।
pip install pyarrow
import pandas as pd
# pyarrow ইঞ্জিন দিয়ে JSON পড়ুন (বড় ফাইলে দ্রুত পার্সিং)
df = pd.read_json("sensor_readings.json", engine="pyarrow")
# to_csv-এর engine প্যারামিটার নেই, কিন্তু পড়া ও লেখার মাঝে
# DataFrame অপারেশনগুলো pyarrow-এর কলামার লেআউট থেকে উপকৃত হয়
df.to_csv("sensor_readings.csv", index=False)
# সত্যিকারের বড় এক্সপোর্টের জন্য, CSV-র পরিবর্তে Parquet-এ লেখার কথা ভাবুন
# — বাইনারি ফরম্যাট, ৫-১০ গুণ ছোট, টাইপ সংরক্ষণ করে
df.to_parquet("sensor_readings.parquet", engine="pyarrow")আপনি যদি কয়েকশো MB-এর বেশি JSON প্রক্রিয়া করছেন এবং চূড়ান্ত কনজিউমার Parquet গ্রহণ করে, CSV সম্পূর্ণ এড়িয়ে যান। Parquet ছোট, কলামের টাইপ সংরক্ষণ করে, এবং Redshift ও BigQuery উভয়ই এটি নেটিভলি লোড করে। CSV একটি lossy ফরম্যাট — প্রতিটি মান স্ট্রিং হয়ে যায়।
সিনট্যাক্স হাইলাইটিং সহ টার্মিনাল আউটপুট
rich লাইব্রেরি টার্মিনালে বর্ডার, অ্যালাইনমেন্ট এবং রঙ সহ টেবিল রেন্ডার করে — আউটপুট ফাইল না খুলেই ডেভেলপমেন্টের সময় একটি রূপান্তর প্রিভিউ করার জন্য দরকারী।
pip install rich
import json
from rich.console import Console
from rich.table import Table
json_string = """
[
{"hostname": "web-prod-1", "cpu_percent": 72.3, "memory_mb": 3840, "uptime_hours": 720},
{"hostname": "web-prod-2", "cpu_percent": 45.1, "memory_mb": 2560, "uptime_hours": 168},
{"hostname": "db-replica-1", "cpu_percent": 91.7, "memory_mb": 7680, "uptime_hours": 2160}
]
"""
records = json.loads(json_string)
console = Console()
table = Table(title="Server Metrics Preview", show_lines=True)
for key in records[0]:
table.add_column(key, style="cyan" if key == "hostname" else "white")
for row in records:
table.add_row(*[str(v) for v in row.values()])
console.print(table)
# টার্মিনালে বর্ডার সহ রঙিন হাইলাইটেড টেবিল রেন্ডার করেcsv.DictWriter বা DataFrame.to_csv() ব্যবহার করুন, এবং শুধু প্রিভিউয়ের জন্য rich ব্যবহার করুন।বড় JSON ফাইলের সাথে কাজ করা
json.load() সম্পূর্ণ ফাইল মেমরিতে পড়ে। ২০০ MB JSON ফাইলের জন্য, এর মানে ~২০০ MB কাঁচা টেক্সট এবং Python অবজেক্টের ওভারহেড — সহজেই ৫০০ MB+ হিপ ব্যবহার। ১০০ MB-এর বেশি ফাইলের জন্য, ijson দিয়ে ইনপুট স্ট্রিম করুন এবং চলার সাথে সাথে CSV সারি লিখুন।
pip install ijson
ijson দিয়ে JSON অ্যারে স্ট্রিমিং করে CSV-তে রূপান্তর
import ijson
import csv
def stream_json_to_csv(json_path: str, csv_path: str) -> int:
"""সম্পূর্ণ মেমরিতে লোড না করে বড় JSON অ্যারে CSV-তে রূপান্তর করুন।"""
with open(json_path, "rb") as jf, open(csv_path, "w", newline="", encoding="utf-8") as cf:
# ijson.items শীর্ষ-স্তরের অ্যারের প্রতিটি উপাদান একটি করে yield করে
records = ijson.items(jf, "item")
first_record = next(records)
fieldnames = list(first_record.keys())
writer = csv.DictWriter(cf, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(first_record)
count = 1
for record in records:
writer.writerow(record)
count += 1
return count
rows = stream_json_to_csv("clickstream_2026_03.json", "clickstream_2026_03.csv")
print(f"Streamed {rows} records to CSV")NDJSON / JSON Lines — প্রতি লাইনে একটি অবজেক্ট
NDJSON (Newline-Delimited JSON), যাকে JSON Lines বা .jsonl বলা হয়, কোনো মোড়ানো অ্যারে ছাড়াই প্রতি লাইনে একটি বৈধ JSON অবজেক্ট সংরক্ষণ করে। এই ফরম্যাট লগ পাইপলাইন, ইভেন্ট স্ট্রিম (Kafka, Kinesis), এবং Elasticsearch ও BigQuery-এর মতো সার্ভিস থেকে বাল্ক এক্সপোর্টে সাধারণ। প্রতিটি লাইন স্বয়ংসম্পূর্ণ JSON অবজেক্ট হওয়ায়, ফাইল হ্যান্ডেলের উপর একটি সাধারণ Python for লুপ দিয়ে NDJSON ফাইল প্রক্রিয়া করা যায় — ijson লাইব্রেরির প্রয়োজন নেই। ফাইলের আকার নির্বিশেষে মেমরি স্থির থাকে, এটিকে সোর্স ডেটা JSON Lines ফরম্যাটে থাকলে সহজতম স্ট্রিমিং পদ্ধতি করে তোলে।
import json
import csv
def ndjson_to_csv(ndjson_path: str, csv_path: str) -> int:
"""নিউলাইন-ডিলিমিটেড JSON ফাইল একটি লাইন করে CSV-তে রূপান্তর করুন।"""
with open(ndjson_path, encoding="utf-8") as nf:
first_line = nf.readline()
first_record = json.loads(first_line)
fieldnames = list(first_record.keys())
with open(csv_path, "w", newline="", encoding="utf-8") as cf:
writer = csv.DictWriter(cf, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(first_record)
count = 1
for line in nf:
line = line.strip()
if not line:
continue
try:
record = json.loads(line)
writer.writerow(record)
count += 1
except json.JSONDecodeError:
continue # ত্রুটিপূর্ণ লাইন এড়িয়ে যান
return count
rows = ndjson_to_csv("access_log.ndjson", "access_log.csv")
print(f"Converted {rows} log entries to CSV")json.load() দিয়ে লোড করলে Python অবজেক্টের ওভারহেডের কারণে ৩–৫ GB RAM ব্যবহার হতে পারে। ijson দিয়ে, ফাইলের আকার নির্বিশেষে মেমরি স্থির থাকে। একটি ছোট ফাইলের দ্রুত রূপান্তর দরকার হলে, পরিবর্তে JSON to CSV কনভার্টার-এ পেস্ট করুন।সাধারণ ভুল
সমস্যা: csv মডিউল \r\n লাইন এন্ডিং লেখে। newline='' ছাড়া, Python-এর টেক্সট মোড Windows-এ আরেকটি \r যোগ করে, ফলে দ্বিগুণ-ব্যবধানের আউটপুট হয়।
সমাধান: CSV লেখার জন্য ফাইল খোলার সময় সবসময় newline='' পাস করুন। macOS/Linux-এ এটি নিরীহ।
with open("output.csv", "w") as f:
writer = csv.DictWriter(f, fieldnames=columns)
writer.writeheader()
writer.writerows(data)
# Windows-এ প্রতিটি ডেটা সারির মাঝে extra blank linewith open("output.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=columns)
writer.writeheader()
writer.writerows(data)
# সব প্ল্যাটফর্মে পরিষ্কার আউটপুটসমস্যা: index=False ছাড়া, pandas স্বয়ংক্রিয়-ক্রমবর্ধমান সারি নম্বর কলাম (0, 1, 2, ...) যোগ করে যা মূল JSON-এ কখনো ছিল না এমন ডেটা দিয়ে CSV দূষিত করে।
সমাধান: to_csv()-এ index=False পাস করুন। যদি আসলেই ইন্ডেক্স কলাম দরকার হয়, df.index.name = 'row_num' দিয়ে স্পষ্টভাবে নাম দিন।
df = pd.read_json("events.json")
df.to_csv("events.csv")
# CSV-তে অতিরিক্ত নামহীন কলাম পাবেন: ,event_id,timestamp,...
# শুরুর কমা অনেক CSV পার্সার ভাঙেdf = pd.read_json("events.json")
df.to_csv("events.csv", index=False)
# পরিষ্কার CSV: event_id,timestamp,...সমস্যা: JSON অবজেক্টের ভিন্ন ভিন্ন key থাকলে (কিছু রেকর্ডে ঐচ্ছিক ফিল্ড), প্রথম রেকর্ডের key-গুলো fieldnames হিসেবে ব্যবহার করলে পরবর্তী রেকর্ডে শুধু আসা কলামগুলো নীরবে বাদ পড়ে।
সমাধান: DictWriter তৈরির আগে সমস্ত রেকর্ড জুড়ে সমস্ত অনন্য key সংগ্রহ করুন।
records = json.load(f) writer = csv.DictWriter(out, fieldnames=records[0].keys()) # records[2]-তে শুধু আসা "discount" ফিল্ড মিস হয়
records = json.load(f) all_keys = list(dict.fromkeys(k for r in records for k in r)) writer = csv.DictWriter(out, fieldnames=all_keys, restval="") # প্রতিটি রেকর্ড থেকে প্রতিটি key কলাম হিসেবে অন্তর্ভুক্ত
সমস্যা: csv.DictWriter নেস্টেড dict-এ str() কল করে, ফলে "{'city': 'Portland'}" এর মতো মান সহ কলাম তৈরি হয় — প্রকৃত ডেটা নয়, কাঁচা Python repr।
সমাধান: আগে pd.json_normalize() বা কাস্টম ফ্ল্যাটেনিং ফাংশন ব্যবহার করে নেস্টেড অবজেক্ট ফ্ল্যাটেন করুন।
records = [{"id": "evt_1", "meta": {"source": "web", "region": "us-west"}}]
writer = csv.DictWriter(f, fieldnames=["id", "meta"])
writer.writerows(records)
# meta কলামে থাকে: {'source': 'web', 'region': 'us-west'}import pandas as pd
records = [{"id": "evt_1", "meta": {"source": "web", "region": "us-west"}}]
df = pd.json_normalize(records, sep="_")
df.to_csv("events.csv", index=False)
# কলামসমূহ: id, meta_source, meta_regioncsv.DictWriter বনাম pandas — দ্রুত তুলনা
csv.DictWriter ব্যবহার করুন যখন আপনার শূন্য নির্ভরতা দরকার, JSON ফ্ল্যাট, এবং স্ক্রিপ্ট সীমাবদ্ধ পরিবেশে চলে (CI কন্টেইনার, Lambda ফাংশন, এমবেডেড Python)।pd.json_normalize() + to_csv() ব্যবহার করুন যখন JSON নেস্টেড, এক্সপোর্টের আগে ডেটা রূপান্তর বা ফিল্টার করতে হয়, বা আপনি ইতিমধ্যে pandas ওয়ার্কফ্লোতে আছেন। মেমরিতে না ধরে এমন ফাইলের জন্য, স্থির-মেমরি স্ট্রিমিংয়ের জন্য ijson এবং csv.DictWriter একসাথে ব্যবহার করুন।
দ্রুত, কোড-মুক্ত রূপান্তরের জন্য, ToolDeck-এর JSON to CSV কনভার্টার কোনো Python সেটআপ ছাড়াই কাজ করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
pandas ছাড়া Python-এ JSON থেকে CSV কীভাবে রূপান্তর করব?
বিল্ট-ইন json ও csv মডিউল ব্যবহার করুন। JSON ফাইলটি dict-এর তালিকায় পার্স করতে json.load() কল করুন। প্রথম dict-এর key থেকে fieldnames বের করুন, একটি csv.DictWriter তৈরি করুন, writeheader() তারপর writerows() কল করুন। এই পদ্ধতিতে বাহ্যিক নির্ভরতা শূন্য এবং যেকোনো Python 3.x পরিবেশে কাজ করে। ছোট ফাইলের জন্য pandas-এর চেয়ে দ্রুততর, কারণ DataFrame বরাদ্দের ওভারহেড নেই। রেকর্ডজুড়ে ভিন্ন key থাকলে, dict.fromkeys(k for r in records for k in r) দিয়ে আগে সব অনন্য key সংগ্রহ করুন। তারপর সেটি fieldnames হিসেবে পাস করুন যাতে কোনো কলাম বাদ না পড়ে।
import json
import csv
with open("orders.json") as f:
records = json.load(f)
with open("orders.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=records[0].keys())
writer.writeheader()
writer.writerows(records)CSV-তে রূপান্তর করার সময় নেস্টেড JSON কীভাবে হ্যান্ডেল করব?
ফ্ল্যাট JSON অ্যারে সরাসরি CSV সারিতে ম্যাপ হয়, কিন্তু নেস্টেড অবজেক্টগুলো আগে ফ্ল্যাটেন করতে হবে। pandas-এ pd.json_normalize() স্বয়ংক্রিয়ভাবে এটি করে — ডট-বিভাজক দিয়ে নেস্টেড key যুক্ত করে (যেমন, "address.city")। pandas ছাড়া, dict চলাচলের জন্য একটি রিকার্সিভ ফাংশন লিখুন এবং একটি ডিলিমিটার দিয়ে key জুড়ুন। গভীরভাবে নেস্টেড স্ট্রাকচারের জন্য json_normalize একটি পাসেই সব স্তর হ্যান্ডেল করে। sep প্যারামিটার key সেগমেন্টের মধ্যে যোগকারী অক্ষর নিয়ন্ত্রণ করে। ডিফল্ট ডটের চেয়ে আন্ডারস্কোর SQL ইম্পোর্ট ও স্প্রেডশিট ফর্মুলায় সাধারণত নিরাপদ।
import pandas as pd
nested_data = [
{"id": "ord_91a3", "customer": {"name": "ফাতেমা বেগম", "email": "fatema.begum@example.com"}},
]
df = pd.json_normalize(nested_data, sep="_")
# কলামসমূহ: id, customer_name, customer_email
df.to_csv("flat_orders.csv", index=False)Windows-এ আমার CSV-এ ডেটা সারির মাঝে ফাঁকা সারি কেন আসছে?
csv মডিউল ডিফল্টরূপে \r\n লাইন এন্ডিং লেখে। Windows-এ, টেক্সট মোডে ফাইল খুললে আরেকটি \r যুক্ত হয়, ফলে \r\r\n তৈরি হয় — যা ফাঁকা সারি হিসেবে দেখায়। সমাধান হলো open()-এ সবসময় newline="" পাস করা। এটি Python-কে লাইন এন্ডিং অনুবাদ না করতে বলে, csv মডিউলকে সেগুলো পরিচালনা করতে দেয়। অপারেটিং সিস্টেম নির্বিশেষে এই প্যাটার্নটি প্রয়োজনীয় — macOS ও Linux-এ এটি নিরীহ, এবং Windows-এ অপরিহার্য। Python ডকুমেন্টেশন csv মডিউল বিভাগে CSV লেখার জন্য ফাইল খোলার সঠিক উপায় হিসেবে এটি স্পষ্টভাবে উল্লেখ করেছে।
# ভুল — Windows-এ ফাঁকা সারি
with open("output.csv", "w") as f:
writer = csv.writer(f)
# সঠিক — newline="" দ্বিগুণ \r প্রতিরোধ করে
with open("output.csv", "w", newline="") as f:
writer = csv.writer(f)বিদ্যমান CSV ফাইলে JSON রেকর্ড কীভাবে যোগ করব?
ফাইলটি append মোডে ("a") খুলুন এবং একই fieldnames দিয়ে একটি DictWriter তৈরি করুন। writeheader() এড়িয়ে যান কারণ হেডার সারি ইতিমধ্যে বিদ্যমান। pandas-এ to_csv(mode="a", header=False) ব্যবহার করুন। নিশ্চিত করুন কলামের ক্রম বিদ্যমান ফাইলের সাথে মিলছে, নইলে ডেটা ভুল কলামে যাবে। কলামের ক্রম সম্পর্কে অনিশ্চিত হলে আগে csv.DictReader দিয়ে ফাইলটি খুলুন। এর fieldnames অ্যাট্রিবিউট পড়ে তারপর writer তৈরি করুন।
import csv
new_records = [
{"order_id": "ord_f4c1", "total": 89.50, "status": "shipped"},
]
with open("orders.csv", "a", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["order_id", "total", "status"])
writer.writerows(new_records)Python-এ বড় JSON ফাইল CSV-তে রূপান্তর করার সবচেয়ে দ্রুত উপায় কী?
500 MB-এর নিচের ফাইলের জন্য, pd.read_json() তারপর to_csv() সবচেয়ে দ্রুত একক-কল পদ্ধতি — pandas অভ্যন্তরীণভাবে অপ্টিমাইজড C কোড ব্যবহার করে। 500 MB-এর উপরের ফাইলের জন্য, ijson ব্যবহার করে JSON রেকর্ড স্ট্রিম করুন এবং csv.DictWriter দিয়ে সারি-দ-সারি CSV-তে লিখুন। এটি ফাইলের আকার নির্বিশেষে মেমরি ব্যবহার স্থির রাখে। NDJSON ফাইলের জন্য (প্রতি লাইনে একটি JSON অবজেক্ট) ijson মোটেই প্রয়োজন নেই। একটি সাধারণ Python for লুপ প্রতিটি লাইন স্বাধীনভাবে প্রক্রিয়া করে এবং কোনো থার্ড-পার্টি লাইব্রেরি ছাড়াই স্থির মেমরি অর্জন করে।
# মেমরিতে ধরে এমন ফাইলের জন্য দ্রুত
import pandas as pd
df = pd.read_json("large_dataset.json")
df.to_csv("large_dataset.csv", index=False)
# মেমরিতে না ধরে এমন ফাইলের জন্য স্ট্রিমিং
import ijson, csv
with open("huge.json", "rb") as jf, open("huge.csv", "w", newline="") as cf:
records = ijson.items(jf, "item")
first = next(records)
writer = csv.DictWriter(cf, fieldnames=first.keys())
writer.writeheader()
writer.writerow(first)
for record in records:
writer.writerow(record)Python-এ ফাইলের পরিবর্তে stdout-এ CSV আউটপুট লিখতে পারি?
হ্যাঁ। csv.writer() বা csv.DictWriter()-এ ফাইল অবজেক্ট হিসেবে sys.stdout পাস করুন। শেল স্ক্রিপ্টে আউটপুট পাইপ করতে বা দ্রুত ডিবাগিংয়ের জন্য এটি উপকারী। pandas-এ, to_csv(sys.stdout, index=False) কল করুন অথবা একটি স্ট্রিং পেতে to_csv(None) ব্যবহার করুন। কোনো অস্থায়ী ফাইলের প্রয়োজন নেই। Windows-এ stdout ডিফল্টরূপে টেক্সট মোডে খোলে, তাই ডাবল ক্যারেজ-রিটার্ন সমস্যা এড়াতে আগে sys.stdout.reconfigure(newline="") কল করুন।
import csv
import sys
import json
data = json.loads('[{"host":"web-1","cpu":72.3},{"host":"web-2","cpu":45.1}]')
writer = csv.DictWriter(sys.stdout, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
# host,cpu
# web-1,72.3
# web-2,45.1সম্পর্কিত টুলস
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.