تكرار السؤال: …
الإجابة المختصرة
استخدم الموديول csv مع فتح الملف بـ newline="" و encoding صريح، واستخدم DictReader و DictWriter، بدل التقسيم اليدوي بـ split(",").
الشرح
ملفات CSV تحتوي حقولًا بين علامات تنصيص وفواصل وأسطر جديدة داخل الحقول، وهو ما يكسره التقسيم اليدوي. newline="" يمنع مضاعفة أسطر نهاية السطر على Windows. حدد encoding (و utf-8-sig لملفات Excel التي تبدأ بـ BOM). عند تصدير بيانات من المستخدمين انتبه لحقن الصيغ (CSV injection): القيم التي تبدأ بـ = أو + أو - أو @ قد تُنفذ كصيغة عند فتحها في Excel.
مثال بالكود
import csv
with open("users.csv", newline="", encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
print(row["email"])
def safe(value: str) -> str:
return "'" + value if value[:1] in "=+-@" else value
with open("export.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "note"])
writer.writeheader()
writer.writerow({"name": "Ali", "note": safe("=HYPERLINK(...)")})أخطاء شائعة
- قراءة CSV بـ line.split(",") فتنكسر الحقول التي تحتوي فواصل.
- تصدير مدخلات المستخدم إلى CSV دون معالجة الصيغ الخطرة.