Python-இல் JSON: கோப்புகளைப் படித்தல் மற்றும் எழுதுதல், CSV, pathlib மற்றும் UTF-8 குறியாக்கம்
Python-இல் JSON-உடன் வேலை செய்ய உள்ளமைவுத் தொகுதி json உள்ளது: json.load திறந்த கோப்பிலிருந்து தரவைப் படிக்கும், json.dump கோப்பில் எழுதும்; json.loads மற்றும் json.dumps அதே வேலையை சரங்களுடன் செய்கின்றன. கோப்பை with open(path, encoding="utf-8") மூலம் திறக்கிறோம், பாதைகளை pathlib.Path மூலம் கட்டுகிறோம், அட்டவணைகளை csv தொகுதியால் படிக்கிறோம்.
Python-இல் JSON-உடன் வேலை செய்ய மூன்றாம் தரப்பு நூலகம் தேவையில்லை: json தொகுதி நிலையான நூலகத்தில் உள்ளது; அது அகராதிகளையும் பட்டியல்களையும் உரையாக்கி மீண்டும் திருப்புகிறது. அதனுடன் கிட்டத்தட்ட எப்போதும் வேண்டியவை மூன்று: with கட்டமைப்புடன் கூடிய open செயல்பாடு, பாதைகளுக்கான pathlib, அட்டவணைகளுக்கான csv. கீழே எல்லாம் வரிசையாக, வேலை செய்யும் குறியீட்டுடனும், பெரும்பாலும் தடுமாறும் பொறிகளுடனும்.
Python open செயல்பாடு: முறைகளும் குறியாக்கமும்
எந்த உரைக் கோப்பையும் உள்ளமைவுச் செயல்பாடு open(path, mode, encoding=...) திறக்கிறது. அது read, readline, write முறைகள் உள்ள கோப்புப் பொருளைத் தரும்; அதை வரி வரியாக சுழலில் கடக்கலாம்.
| முறை | என்ன செய்கிறது |
|---|---|
"r" | படிக்க (இயல்பு). கோப்பு இல்லையென்றால் FileNotFoundError |
"w" | எழுத. கோப்பு உருவாகும் அல்லது திறந்த உடனேயே காலியாகும் |
"a" | இறுதியில் சேர்க்க; ஏற்கனவே உள்ள உள்ளடக்கம் தொடப்படாது |
"x" | புதிய கோப்பை உருவாக்க; ஏற்கனவே இருந்தால் FileExistsError |
"b" | முறைக்கான சேர்க்கை: பைட்டுகளுடன் வேலை ("rb", "wb") |
with ஏன் தேவை
கோப்பை மூட வேண்டும்: இல்லையென்றால் தரவு வட்டில் எழுதப்படாமல் போகலாம், கணினி கோப்பு விவரிப்பியை பிடித்து வைத்திருக்கும். with கட்டமைப்பு கோப்பை தானாக மூடுகிறது — தொகுதிக்குள் பிழை வந்தாலும் கூட.
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("முதல் வரி\n")
f.write("இரண்டாம் வரி\n")
with open("notes.txt", encoding="utf-8") as f:
for line in f:
print(line.rstrip("\n"))
கோப்பை சுழலில் கடப்பது அதை ஒவ்வொரு வரியாகப் படிக்கும்; முழுவதும் நினைவகத்தில் ஏற்றாது — அதனால் கிகாபைட் அளவுள்ள பதிவுக் கோப்புகளையும் செயலாக்கலாம். f.read() முழு உள்ளடக்கத்தையும் ஒரே சரமாகத் தரும், f.readlines() வரிகளின் பட்டியலைத் தரும்.
ஏற்கனவே உள்ளதை அழிக்காமல் கோப்பில் எழுதுவது எப்படி
தொடக்கநிலையாளரின் மிகப் பொதுவான தவறு — ஒரு வரியை "சேர்ப்பதற்காக" "w" முறையில் கோப்பைத் திறப்பது. "w" முறை திறக்கும் தருணத்திலேயே, முதல் write-க்கு முன்பே கோப்பை காலியாக்குகிறது. பதிவை இறுதியில் சேர்க்க "a" பயன்படுத்துங்கள்; பிறருடைய கோப்பை மேலெழுதாமல் உறுதிப்படுத்த "x".
with open("log.txt", "a", encoding="utf-8") as f:
f.write("புதிய பதிவு\n")
write வரி முறிவைத் தானாகச் சேர்க்காது — "\n" வெளிப்படையாக எழுத வேண்டும். print(..., file=f) பயன்படுத்தலாம்: அது அடுத்த வரிக்கு மாற்றுவதை உங்களுக்காகச் செய்யும்.
UTF-8 குறியாக்கம்: "உடைந்த எழுத்துகள்" ஏன் தோன்றுகின்றன
Python 3.15-க்கு முன், encoding அளவுரு இல்லாமல் open() கணினியின் குறியாக்கத்தை எடுத்துக்கொண்டது. Linux மற்றும் macOS-இல் அது UTF-8; தமிழ் லோக்கல் கொண்ட Windows-இல் பெரும்பாலும் cp1251 அல்லது அதற்கு இணையானது. சேவையகத்தில் சரியாக வேலை செய்த ஸ்கிரிப்ட் சக ஊழியரின் மடிக்கணினியில் "Еда" போன்ற குப்பையை அச்சிட்டது, அல்லது UnicodeDecodeError-உடன் விழுந்தது.
Python 3.15-இல் PEP 686-இன்படி UTF-8 முறை இயல்பாக இயக்கப்பட்டுள்ளது: encoding இல்லாமல் open() எல்லா இயக்க முறைமைகளிலும் UTF-8-ஐப் படித்து எழுதும். பழைய நடத்தையைத் திரும்பப் பெற PYTHONUTF8=0 சூழல் மாறி அல்லது -X utf8=0 கொடி; கணினி குறியாக்கத்தை வெளிப்படையாகக் கேட்க — encoding="locale".
import sys
print(sys.flags.utf8_mode) # Python 3.15-இல் 1
open("legacy.txt", encoding="locale") # கணினி குறியாக்கம்
open("old_excel.csv", encoding="cp1251") # cp1251-இல் சேமிக்கப்பட்ட கோப்பு
மறுபக்கம்: Excel அல்லது Windows ஸ்கிரிப்டிலிருந்து cp1251-இல் சேமிக்கப்பட்ட பழைய CSV இப்போது UTF-8 என்று படிக்கப்பட்டு UnicodeDecodeError தரும். தீர்வு: encoding="cp1251"-உடன் படித்து UTF-8-ஆக மீண்டும் சேமிப்பது. நல்ல பழக்கம் மாறவில்லை — encoding-ஐ வெளிப்படையாகக் குறியுங்கள்; அப்போது குறியீடு எந்தப் பதிப்பிலும் ஒரே மாதிரி நடந்துகொள்ளும்.
Python pathlib: பாதைகள் பொருட்களாக
பாதைகளை சரங்களாக இணைப்பது ("data" + "/" + name) சிரமமானது, வெவ்வேறு இயக்க முறைமைகளில் உடையும். pathlib தொகுதியின் Path வகுப்பில் பாதைகள் / இயக்கியால் இணைகின்றன; பொருளுக்கு தெளிவான பண்புக்கூறுகளும் உண்டு.
from pathlib import Path
data = Path("data")
csv_path = data / "expenses.csv"
print(csv_path.name) # expenses.csv
print(csv_path.stem) # expenses
print(csv_path.suffix) # .csv
print(csv_path.parent) # data
print(csv_path.exists())
data.mkdir(parents=True, exist_ok=True)
(data / "hello.txt").write_text("வணக்கம்", encoding="utf-8")
print((data / "hello.txt").read_text(encoding="utf-8"))
for p in data.glob("*.csv"):
print(p)
read_text மற்றும் write_text முறைகள் சிறிய கோப்புகளுக்கு open + with இணையை மாற்றுகின்றன. Path பொருளை சாதாரண open, json மற்றும் csv எல்லாவற்றுக்கும் அனுப்பலாம் — அனைத்தும் அதை ஏற்கும். ஸ்கிரிப்டின் அடைவைப் பொறுத்த பாதை, தற்போதைய அடைவைப் பொறுத்தது அல்ல: Path(__file__).parent / "data".
Python 3.14-இல் Path-க்கு copy() மற்றும் move() முறைகள் வந்தன; எளிய நகலுக்கு shutil இனி தேவையில்லை. அதே பதிப்பில் நிலையான நூலகத்தில் Zstandard சுருக்கத்துக்கான compression.zstd தொகுதியும் சேர்ந்தது (PEP 784).
Python JSON: load, dump, loads, dumps
JSON என்பது தரவுப் பரிமாற்றத்துக்கான உரை வடிவம்: API-கள் அதை அனுப்புகின்றன, அமைப்புகளும் அறிக்கைகளும் அதில் சேமிக்கப்படுகின்றன. json தொகுதி இரண்டு செயல்பாடுகளைச் செய்கிறது: தொடராக்கம் (Python பொருள் → JSON உரை) மற்றும் நீக்கத் தொடராக்கம் (உரை → பொருள்). முறைகள் நான்கு; அவற்றிடையே குழப்பம் பொதுவான கேள்வி.
| செயல்பாடு | என்ன செய்கிறது |
|---|---|
json.dumps(obj) | பொருள் → JSON சரம் |
json.loads(s) | JSON சரம் → பொருள் |
json.dump(obj, f) | பொருள் → திறந்த கோப்பில் எழுது |
json.load(f) | திறந்த கோப்பிலிருந்து JSON-ஐப் படி |
நினைவில் கொள்வது எளிது: இறுதியில் உள்ள s எழுத்து string — சரத்துடன் வேலை; அது இல்லையென்றால் கோப்புடன்.
வகைகளின் பொருத்தம்
| Python | JSON |
|---|---|
dict | பொருள் {} |
list, tuple | வரிசை [] |
str | சரம் |
int, float | எண் |
True / False | true / false |
None | null |
மீண்டும் படிக்கும்போது tuple பட்டியலாக மாறும்; set, தேதிகள் மற்றும் Decimal-ஐ தொகுதிக்குத் தெரியாது — TypeError: Object of type ... is not JSON serializable வரும்.
JSON-ஐ கோப்பில் சேமிப்பது
import json
from pathlib import Path
report = {
"month": "2026-10",
"total": 15230.5,
"categories": {"உணவு": 8200, "போக்குவரத்து": 2100},
"tags": ["வீடு", "வேலை"],
}
path = Path("data/report.json")
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
ensure_ascii=False தமிழ் எழுத்துகளை அப்படியே வைத்திருக்கும். அது இல்லையென்றால் கோப்பில் "உணவு" என்பதற்குப் பதிலாக "உ..." வடிவம் வரும் — அது சரியான JSON, ஆனால் மனிதர்களால் படிக்க முடியாது. indent=2 உள்தள்ளல்களுடன் அழகான வடிவமைப்பைத் தரும்.
கோப்பிலிருந்து JSON-ஐப் படிப்பது
with open("data/report.json", encoding="utf-8") as f:
data = json.load(f)
print(data["total"]) # 15230.5
print(data["categories"]["உணவு"]) # 8200
முடிவு சாதாரண அகராதி அல்லது பட்டியல்; அதை வழக்கமான கருவிகளால் கையாளலாம். கோப்பு JSON அல்ல அல்லது துண்டிக்கப்பட்டிருந்தால் வரி மற்றும் நிலை எண்ணுடன் json.JSONDecodeError வரும் — தரவு வெளியிலிருந்து வரும்போது அதைப் பிடிப்பது அவசியம்.
JSON சரத்தை அலசுவதும் அழகாக அச்சிடுவதும்
import json
raw = '{"name": "அன்னா", "skills": ["python", "sql"], "active": true}'
user = json.loads(raw)
print(user["skills"][0]) # python
print(json.dumps(user, ensure_ascii=False, indent=2, sort_keys=True))
sort_keys=True வெளியீட்டில் விசைகளை வரிசைப்படுத்தும் — git-இல் கோப்புகளை ஒப்பிட வசதியானது. Terminal-இலிருந்து கோப்பை அழகாக வடிவமைக்க உள்ளமைவுக் கருவி உண்டு: python -m json.tool data/report.json.
HTTP API-இன் பதிலும் JSON சரமே. requests நூலகம் அதை response.json() முறையால் அலசுகிறது; உள்ளே இருப்பது அதே json.loads.
பொறி: JSON விசைகள் எப்போதும் சரங்கள்
d = {1: "ஜனவரி", 2: "பிப்ரவரி"}
back = json.loads(json.dumps(d))
print(back == d) # False
print(back) # {'1': 'ஜனவரி', '2': 'பிப்ரவரி'}
# back[1] -> KeyError, back["1"] என்று எழுத வேண்டும்
fixed = {int(k): v for k, v in back.items()}
JSON-இல் பொருளின் விசைகள் சரங்களாக மட்டுமே இருக்க முடியும்; அதனால் எண் விசைகள் தொடராக்கம் சுற்றுக்குப் பின் சரங்களாக மாறும். படிக்கும்போது அவற்றை மீண்டும் மாற்றுங்கள்.
சொந்த வகைகள்: தேதிகளும் Decimal-உம்
import json
from datetime import date
def default(obj):
if isinstance(obj, date):
return obj.isoformat()
raise TypeError(f"{type(obj).__name__} வகையை தொடராக்க முடியாது")
print(json.dumps({"day": date(2026, 10, 1)}, default=default))
# {"day": "2026-10-01"}
default அளவுருவில் உள்ள செயல்பாடு அறியாத ஒவ்வொரு பொருளுக்கும் அழைக்கப்படுகிறது. சிக்கலான நிலைகளில் json.JSONEncoder-இலிருந்து மரபுரிமை பெற்று default முறையை மேலெழுதலாம்.
JSON வரிசையில் ஒரு உறுப்பைச் சேர்ப்பது
JSON-ஐ உரைப் பதிவு போல இறுதியில் சேர்க்க முடியாது: கோப்பை முழுவதும் படித்து, மாற்றி, முழுவதுமாக எழுத வேண்டும்.
path = Path("data/items.json")
items = json.loads(path.read_text(encoding="utf-8")) if path.exists() else []
items.append({"id": len(items) + 1, "title": "புதியது"})
path.write_text(json.dumps(items, ensure_ascii=False, indent=2), encoding="utf-8")
பதிவுகள் அதிகமாக இருந்து தொடர்ந்து சேர்க்கப்பட்டால், JSON Lines வடிவம் வசதியானது: ஒரு வரியில் ஒரு JSON பொருள், கோப்பு "a" முறையில் திறக்கப்படுகிறது.
Python-இல் CSV: csv தொகுதி
CSV என்பது உரைக் கோப்பிலுள்ள அட்டவணை: வரிகள் பதிவுகள், மதிப்புகள் காற்புள்ளிகளால் பிரிக்கப்படுகின்றன. csv தொகுதி மேற்கோள்கள், மதிப்புகளுக்குள் உள்ள காற்புள்ளிகள் மற்றும் வரி முறிவுகளை சரியாகக் கையாள்கிறது; கைமுறை split(",") அதைச் செய்யாது.
import csv
with open("data/expenses.csv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
total = 0.0
for row in reader:
total += float(row["amount"])
print(row["date"], row["category"], row["amount"])
print("மொத்தம்:", total)
csv.DictReader ஒவ்வொரு வரியையும் கோப்பின் தலைப்பால் அகராதியாக மாற்றும். எல்லா மதிப்புகளும் சரங்கள்: எண்களையும் தேதிகளையும் நீங்களே மாற்றுங்கள் (float, int, date.fromisoformat). ";" பிரிப்பான் கொண்ட கோப்பு (தமிழ் Excel இப்படித்தான் சேமிக்கிறது) delimiter=";" அளவுருவுடன் படிக்கப்படுகிறது.
rows = [
{"date": "2026-10-01", "category": "உணவு", "amount": 450},
{"date": "2026-10-02", "category": "போக்குவரத்து", "amount": 60},
]
with open("data/out.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["date", "category", "amount"])
writer.writeheader()
writer.writerows(rows)
எழுதும்போது newline="" கட்டாயம்: இல்லையென்றால் Windows-இல் வரிகளுக்கு இடையே வெற்று வரிகள் தோன்றும். கோப்பை Excel-இல் திறக்கப் போகிறீர்கள் என்றால் encoding="utf-8-sig" பயன்படுத்துங்கள் — BOM குறி Excel-க்கு UTF-8-ஐ அடையாளம் காண உதவும்.
CSV-இலிருந்து JSON-க்கு: முழு எடுத்துக்காட்டு
import csv
import json
from collections import defaultdict
from pathlib import Path
src = Path("data/expenses.csv")
dst = Path("data/report.json")
by_category = defaultdict(float)
with src.open(newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
by_category[row["category"]] += float(row["amount"])
report = {"total": sum(by_category.values()), "categories": dict(by_category)}
dst.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8")
print(dst.read_text(encoding="utf-8"))
எந்த அறிக்கை ஸ்கிரிப்டின் அடிப்படையும் இதுதான்: CSV-இல் நுழைவு, அகராதியில் தொகுப்பு, JSON-இல் வெளியீடு.
பொதுவான தவறுகள்
FileNotFoundError— பாதை உறவினர் வகையில், ஓட்டத்தின் தற்போதைய அடைவிலிருந்து கணக்கிடப்படுகிறது, ஸ்கிரிப்டிலிருந்து அல்ல.Path(__file__).parentபயன்படுத்துங்கள்.- கோப்பு காலியானது —
"a"-க்குப் பதிலாக"w"-இல் திறந்துவிட்டீர்கள். UnicodeDecodeError— கோப்பு வேறு குறியாக்கத்தில்; அதை வெளிப்படையாகக் குறியுங்கள் (cp1251,utf-8-sig).TypeError: Object of type set is not JSON serializable— பட்டியலாக மாற்றுங்கள் அல்லதுdefault-ஐ அனுப்புங்கள்.- JSON ஏற்றிய பின்
KeyError— எண் விசைகள் சரங்களாக மாறிவிட்டன. - சொந்தக் கோப்புக்கு
json.pyஅல்லதுcsv.pyஎன்று பெயரிடுவது — அது நிலையான தொகுதியை மறைக்கும்,import jsonஉங்கள் கோப்பை இறக்குமதி செய்யும்.
சுருக்கம்
Python-இல் JSON-க்கு நிலையான நூலகம் போதும்: கோப்புகளுக்கு json.load/json.dump, சரங்களுக்கு loads/dumps, படிக்கக்கூடிய வெளியீட்டுக்கு ensure_ascii=False மற்றும் indent. கோப்புகளை வெளிப்படையான குறியாக்கத்துடன் with-ஆல் திறவுங்கள், பாதைகளை pathlib-ஆல் கட்டுங்கள், அட்டவணைகளை csv.DictReader-ஆல் படியுங்கள். Python பாடநெறியில் இந்தத் தலைப்பு நடைமுறையில் விளக்கப்பட்டுள்ளது: செலவு கண்காணிப்பான் செலவுகளை CSV-இலிருந்து படித்து அறிக்கையை JSON-ஆக சேமிக்கிறது.
அடிக்கடி கேட்கப்படும் கேள்விகள்
json.load மற்றும் json.loads இடையே வேறுபாடு என்ன?
json.load திறந்த கோப்புப் பொருளிலிருந்து JSON-ஐப் படிக்கிறது, json.loads சரத்தை அலசுகிறது. அதேபோல json.dump கோப்பில் எழுதுகிறது, json.dumps சரத்தைத் திருப்புகிறது.
JSON-இல் தமிழ் எழுத்துகளை <code>\u</code> வடிவம் இல்லாமல் எப்படி சேமிப்பது?
json.dump அல்லது json.dumps-இல் <code>ensure_ascii=False</code> கொடுங்கள், கோப்பை <code>encoding="utf-8"</code>-உடன் திறவுங்கள்.
JSON-உடன் வேலை செய்ய நூலகம் நிறுவ வேண்டுமா?
இல்லை, json தொகுதி நிலையான நூலகத்தில் உள்ளது; <code>import json</code> எழுதினால் போதும்.
JSON-இல் தேதியையோ set-ஐயோ சேமிக்க முடியுமா?
நேரடியாக முடியாது: அவற்றை மாற்ற வேண்டும் — தேதியை isoformat மூலம் ISO சரமாக, set-ஐ பட்டியலாக; அல்லது <code>default</code> அளவுருவுக்கு செயல்பாட்டை அனுப்புங்கள்.
நினைவகத்தில் பொருந்தாத பெரிய JSON-ஐ எப்படிப் படிப்பது?
நிலையான json.load கோப்பை முழுவதும் படிக்கும்; பெரிய தரவுக்கு JSON Lines வடிவத்தில் சேமித்து, ஒவ்வொரு வரியையும் json.loads மூலம் அலசுங்கள்.
“Python 3.15: от новичка до профи” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.
பாடநெறிக்குச் செல்