Python csv.unix_dialect: ส่งไฟล์ CSV ข้ามเครื่องโดยไม่พังเพราะขึ้นบรรทัดใหม่
น้องกายEngineering
ไฟล์ CSV ที่สร้างบน Windows แล้วย้ายไป Linux มักสะดุดเรื่องขึ้นบรรทัดใหม่และ quote ครับ csv.unix_dialect กำหนดให้ quote ทุกฟิลด์ ใช้ LF และ escape แบบมาตรฐาน เหมาะกับ pipeline ที่เครื่องปลายทางหลากหลาย
WHY: สัญญาเดียวข้าม OS
เหมือนติดสติกเกอร์กันน้ำทุกกล่องก่อนส่งพัสดุ ไม่ต้องเดาว่ากล่องไหนมีจุลภาคในชื่อสินค้า
HOW: เขียนแล้วอ่านกลับด้วย dialect เดียวกัน
import csv
import io
import unittest
class UnixDialectTests(unittest.TestCase):
def test_roundtrip_quotes_all(self) -> None:
buf = io.StringIO()
writer = csv.writer(buf, dialect=csv.unix_dialect)
writer.writerow(["name", "note"])
writer.writerow(["coffee", "hot, iced"])
text = buf.getvalue()
self.assertIn('"coffee"', text)
self.assertIn('"hot, iced"', text)
self.assertNotIn("\r\n", text)
buf.seek(0)
rows = list(csv.reader(buf, dialect=csv.unix_dialect))
self.assertEqual(rows[1], ["coffee", "hot, iced"])
if __name__ == "__main__":
unittest.main()
ถ้าปลายทางเป็น Excel บน Windows อาจยังต้องการ excel dialect หรือ UTF-8 BOM แยกสัญญาตามผู้รับ
Recap
- ใช้
csv.unix_dialectเมื่อส่งข้าม Unix tools - quote ครบช่วยฟิลด์ที่มีจุลภาค
- ทดสอบ roundtrip ด้วย reader ชุดเดียวกัน
- แยก dialect สำหรับ Excel ถ้าจำเป็น