นากกายกำลังห่อกล่องข้อความทุกช่องด้วยเครื่องหมายคำพูดก่อนส่งผ่านสายพานข้ามเครื่อง

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 ถ้าจำเป็น