ToolDeck

Python-এ JSON থেকে CSV — DictWriter ও pandas উদাহরণ

·Backend Developer·পর্যালোচনা করেছেনPriya Sharma·প্রকাশিত

বিনামূল্যে অনলাইন 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-ই জটিলতা তৈরি করে। কাঁচা ডেটা একই থাকে; শুধু কাঠামো পরিবর্তন হয়।

Before · json
After · json
[{"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 অন্তর্ভুক্ত হবে তা উভয়ই নিয়ন্ত্রণ করে।

Python 3.8+ — ন্যূনতম json to csv উদাহরণ
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.95

open()-এ newline="" আর্গুমেন্টটি Windows-এ ঐচ্ছিক নয়। এটি ছাড়া, ডবল ক্যারেজ রিটার্ন পাবেন — যা Excel-এ প্রতিটি ডেটা সারির মাঝে ফাঁকা সারি হিসেবে দেখা যায়। macOS ও Linux-এ এটি নিরীহ, তাই সবসময় এটি অন্তর্ভুক্ত করুন।

উপরের কোডে স্ট্রিংয়ের জন্য json.loads() ব্যবহার করা হয়েছে। ফাইল হ্যান্ডেল থেকে পড়ার সময় json.load() (শেষে s ছাড়া) ব্যবহার করুন। এটি মানুষকে প্রায়ই বিভ্রান্ত করে — একটি স্ট্রিং পড়ে, অপরটি ফাইল অবজেক্ট পড়ে।

Python 3.8+ — JSON ফাইল পড়ুন, CSV ফাইল লিখুন
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 মান বৈজ্ঞানিক নোটেশন এড়াতে স্পষ্ট ফরম্যাটিং প্রয়োজন।

Python 3.8+ — CSV লেখার আগে 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

প্যারামিটার
টাইপ
ডিফল্ট
বিবরণ
f
file object
(আবশ্যক)
write() মেথড সহ যেকোনো অবজেক্ট — সাধারণত open() থেকে প্রাপ্ত
fieldnames
sequence
(আবশ্যক)
CSV আউটপুটে কলামের ক্রম নির্ধারণকারী কী-গুলোর তালিকা
restval
str
""
fieldnames-এ থাকা কোনো কী dict-এ না থাকলে যে মান লেখা হবে
extrasaction
str
"raise"
"raise" অতিরিক্ত কী-র জন্য ValueError ছোড়ে; "ignore" নীরবে বাদ দেয়
dialect
str / Dialect
"excel"
পূর্বনির্ধারিত ফরম্যাটিং নিয়ম — "excel", "excel-tab", বা "unix"
delimiter
str
","
ফিল্ড আলাদাকারী একটি অক্ষর — TSV আউটপুটের জন্য "\t" ব্যবহার করুন
quotechar
str
"
delimiter যুক্ত ফিল্ড কোট করতে ব্যবহৃত অক্ষর
quoting
int
csv.QUOTE_MINIMAL
কোটিং কখন প্রযোজ্য তা নিয়ন্ত্রণ করে — MINIMAL, ALL, NONNUMERIC, NONE
lineterminator
str
"\r\n"
প্রতিটি সারির পরে যুক্ত স্ট্রিং — Unix-স্টাইল আউটপুটের জন্য "\n" দিয়ে ওভাররাইড করুন

pandas — DataFrame দিয়ে JSON থেকে CSV রূপান্তর

আপনি যদি ইতিমধ্যে pandas-ভারী কোডবেসে কাজ করছেন, বা আপনার JSON-এ নেস্টেড অবজেক্ট থাকে যেগুলো ফ্ল্যাটেন করতে হবে, pandas পদ্ধতিতে stdlib সংস্করণের চেয়ে উল্লেখযোগ্যভাবে কম কোড লাগে। ট্রেডঅফ: pandas একটি ~30 MB নির্ভরতা। একটি সাময়িক স্ক্রিপ্টের জন্য, এটি ঠিক আছে। প্রোডাকশনে পাঠানো Docker ইমেজের জন্য, stdlib পদ্ধতি হালকা রাখে।

Python 3.8+ — pandas read_json তারপর to_csv
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 ঘুরে ডট-বিভাজক নামসহ কলামে ফ্ল্যাটেন করে।

Python 3.8+ — json_normalize ব্যবহার করে নেস্টেড JSON ফ্ল্যাটেন করুন
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, total

sep="_" প্যারামিটার নেস্টেড 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 ওয়ার্কফ্লোতে এগুলোই গুরুত্বপূর্ণ।

প্যারামিটার
টাইপ
ডিফল্ট
বিবরণ
path_or_buf
str / Path / None
None
ফাইল পাথ বা বাফার — None হলে CSV স্ট্রিং হিসেবে ফেরত দেয়
sep
str
","
ফিল্ড ডিলিমিটার — TSV-এর জন্য "\t" ব্যবহার করুন
index
bool
True
প্রথম কলাম হিসেবে সারির ইন্ডেক্স লেখে — প্রায় সবসময় False করুন
columns
list
None
আউটপুটে কলামের সাবসেট নির্বাচন ও পুনর্বিন্যাস করুন
header
bool / list
True
কলামের নাম লেখে — বিদ্যমান ফাইলে যোগ করার সময় False করুন
encoding
str
"utf-8"
আউটপুট এনকোডিং — Windows-এ Excel-এর সামঞ্জস্যের জন্য "utf-8-sig" ব্যবহার করুন
na_rep
str
""
অনুপস্থিত মানের (NaN, None) স্ট্রিং প্রতিনিধিত্ব
quoting
int
csv.QUOTE_MINIMAL
ফিল্ড কোট করার সময় নিয়ন্ত্রণ করে
Python 3.8+ — সাধারণ প্যারামিটার ওভাররাইড সহ to_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-এ লগ করে, এবং সারির সংখ্যা ফেরত দেয় যাতে কলার শূন্য-সারির আউটপুট শনাক্ত করে সতর্ক করতে পারে।

ডিস্কের ফাইল — পড়ুন, রূপান্তর করুন, সংরক্ষণ করুন

Python 3.8+ — এরর হ্যান্ডলিং সহ JSON ফাইল CSV-তে রূপান্তর
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 রেসপন্স — ফেচ ও রূপান্তর

Python 3.8+ — API থেকে JSON ফেচ করে CSV হিসেবে সংরক্ষণ
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-এর মধ্য দিয়ে পাইপ করুন, তারপর রূপান্তর করুন।

bash — one-liner json to csv রূপান্তর
# 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
bash — argparse সহ স্বনির্ভর CLI স্ক্রিপ্ট
# 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)
" "$@"
bash — জটিল রূপান্তরের জন্য jq + csvkit ব্যবহার
# 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.csv

Miller (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 প্যারামিটার সেট করুন।

bash — pyarrow ইনস্টল করুন
pip install pyarrow
Python 3.8+ — দ্রুত CSV লেখার জন্য pyarrow সহ pandas
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 লাইব্রেরি টার্মিনালে বর্ডার, অ্যালাইনমেন্ট এবং রঙ সহ টেবিল রেন্ডার করে — আউটপুট ফাইল না খুলেই ডেভেলপমেন্টের সময় একটি রূপান্তর প্রিভিউ করার জন্য দরকারী।

bash — rich ইনস্টল করুন
pip install rich
Python 3.8+ — rich দিয়ে টার্মিনালে CSV আউটপুট প্রিভিউ করুন
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)
# টার্মিনালে বর্ডার সহ রঙিন হাইলাইটেড টেবিল রেন্ডার করে
সতর্কতা:Rich শুধুমাত্র টার্মিনাল ডিসপ্লের জন্য। CSV ফাইল তৈরিতে এটি ব্যবহার করবেন না — এটি ANSI এস্কেপ কোড যোগ করে যা আউটপুট নষ্ট করবে। ফাইলে লেখার জন্য csv.DictWriter বা DataFrame.to_csv() ব্যবহার করুন, এবং শুধু প্রিভিউয়ের জন্য rich ব্যবহার করুন।

বড় JSON ফাইলের সাথে কাজ করা

json.load() সম্পূর্ণ ফাইল মেমরিতে পড়ে। ২০০ MB JSON ফাইলের জন্য, এর মানে ~২০০ MB কাঁচা টেক্সট এবং Python অবজেক্টের ওভারহেড — সহজেই ৫০০ MB+ হিপ ব্যবহার। ১০০ MB-এর বেশি ফাইলের জন্য, ijson দিয়ে ইনপুট স্ট্রিম করুন এবং চলার সাথে সাথে CSV সারি লিখুন।

bash — ijson ইনস্টল করুন
pip install ijson

ijson দিয়ে JSON অ্যারে স্ট্রিমিং করে CSV-তে রূপান্তর

Python 3.8+ — স্থির মেমরিতে বড় 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 ফরম্যাটে থাকলে সহজতম স্ট্রিমিং পদ্ধতি করে তোলে।

Python 3.8+ — NDJSON লাইন-দ-লাইন CSV-তে রূপান্তর
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 ফাইল ১০০ MB ছাড়ালে স্ট্রিমিংয়ে যান। ১ GB JSON অ্যারে json.load() দিয়ে লোড করলে Python অবজেক্টের ওভারহেডের কারণে ৩–৫ GB RAM ব্যবহার হতে পারে। ijson দিয়ে, ফাইলের আকার নির্বিশেষে মেমরি স্থির থাকে। একটি ছোট ফাইলের দ্রুত রূপান্তর দরকার হলে, পরিবর্তে JSON to CSV কনভার্টার-এ পেস্ট করুন।

সাধারণ ভুল

open()-এ newline='' বাদ — Windows-এ ফাঁকা সারি

সমস্যা: csv মডিউল \r\n লাইন এন্ডিং লেখে। newline='' ছাড়া, Python-এর টেক্সট মোড Windows-এ আরেকটি \r যোগ করে, ফলে দ্বিগুণ-ব্যবধানের আউটপুট হয়।

সমাধান: CSV লেখার জন্য ফাইল খোলার সময় সবসময় newline='' পাস করুন। macOS/Linux-এ এটি নিরীহ।

Before · Python
After · Python
with open("output.csv", "w") as f:
    writer = csv.DictWriter(f, fieldnames=columns)
    writer.writeheader()
    writer.writerows(data)
# Windows-এ প্রতিটি ডেটা সারির মাঝে extra blank line
with open("output.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=columns)
    writer.writeheader()
    writer.writerows(data)
# সব প্ল্যাটফর্মে পরিষ্কার আউটপুট
pandas to_csv()-এ index=False ভুলে যাওয়া

সমস্যা: index=False ছাড়া, pandas স্বয়ংক্রিয়-ক্রমবর্ধমান সারি নম্বর কলাম (0, 1, 2, ...) যোগ করে যা মূল JSON-এ কখনো ছিল না এমন ডেটা দিয়ে CSV দূষিত করে।

সমাধান: to_csv()-এ index=False পাস করুন। যদি আসলেই ইন্ডেক্স কলাম দরকার হয়, df.index.name = 'row_num' দিয়ে স্পষ্টভাবে নাম দিন।

Before · Python
After · Python
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,...
অসামঞ্জস্যপূর্ণ key সহ records-এ records[0].keys() ব্যবহার

সমস্যা: JSON অবজেক্টের ভিন্ন ভিন্ন key থাকলে (কিছু রেকর্ডে ঐচ্ছিক ফিল্ড), প্রথম রেকর্ডের key-গুলো fieldnames হিসেবে ব্যবহার করলে পরবর্তী রেকর্ডে শুধু আসা কলামগুলো নীরবে বাদ পড়ে।

সমাধান: DictWriter তৈরির আগে সমস্ত রেকর্ড জুড়ে সমস্ত অনন্য key সংগ্রহ করুন।

Before · Python
After · Python
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 কলাম হিসেবে অন্তর্ভুক্ত
ফ্ল্যাটেন না করে নেস্টেড dict সরাসরি CSV-তে লেখা

সমস্যা: csv.DictWriter নেস্টেড dict-এ str() কল করে, ফলে "{'city': 'Portland'}" এর মতো মান সহ কলাম তৈরি হয় — প্রকৃত ডেটা নয়, কাঁচা Python repr।

সমাধান: আগে pd.json_normalize() বা কাস্টম ফ্ল্যাটেনিং ফাংশন ব্যবহার করে নেস্টেড অবজেক্ট ফ্ল্যাটেন করুন।

Before · Python
After · Python
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_region

csv.DictWriter বনাম pandas — দ্রুত তুলনা

পদ্ধতি
নেস্টেড JSON
কাস্টম টাইপ
স্ট্রিমিং
নির্ভরতা
ইনস্টল প্রয়োজন
csv.DictWriter
✗ (ম্যানুয়াল ফ্ল্যাটেন)
✓ (সারি-দ-সারি)
কোনোটি নয়
না (stdlib)
csv.writer
✓ (সারি-দ-সারি)
কোনোটি নয়
না (stdlib)
pd.DataFrame.to_csv()
✗ (শুধু ফ্ল্যাট)
✓ (dtypes-এর মাধ্যমে)
pandas + numpy
pip install
pd.json_normalize() + to_csv()
✓ (dtypes-এর মাধ্যমে)
pandas + numpy
pip install
csv.writer + json_flatten
flatten_json
pip install
jq + csvkit (CLI)
✓ (jq-এর মাধ্যমে)
N/A
jq, csvkit
সিস্টেম ইনস্টল

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 হিসেবে পাস করুন যাতে কোনো কলাম বাদ না পড়ে।

Python
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 ইম্পোর্ট ও স্প্রেডশিট ফর্মুলায় সাধারণত নিরাপদ।

Python
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 লেখার জন্য ফাইল খোলার সঠিক উপায় হিসেবে এটি স্পষ্টভাবে উল্লেখ করেছে।

Python
# ভুল — 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 তৈরি করুন।

Python
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 লুপ প্রতিটি লাইন স্বাধীনভাবে প্রক্রিয়া করে এবং কোনো থার্ড-পার্টি লাইব্রেরি ছাড়াই স্থির মেমরি অর্জন করে।

Python
# মেমরিতে ধরে এমন ফাইলের জন্য দ্রুত
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="") কল করুন।

Python
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

সম্পর্কিত টুলস

MS
Maria SantosBackend Developer

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.

PS
Priya Sharmaপ্রযুক্তিগত পর্যালোচক

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.