Python で CSVを読み込む

緩すぎる規定の RFC4180 だけのルールで厳しい場合がある。
csv.readercsv.DictReader の引数で読込みオプションをいろいろ指定できるが、、、


quotechar='"'
括り文字、すなわち、デリミタ、quotechar 、改行、特殊文字を囲む時の1文字

doublequote=True
フィールド内の quotechar を自身でエスケープするかエスケープ文字でエスケープするか。
(これを Falseで指定することは普通はしないであろう)

skipinitialspace =False
True なら、デリミタ(カンマ)の後のスペース文字を無視してくれる。

この skipinitialspace は、括り文字の後のデリミタまでの空白は、無視してしてくれない!



読込サンプル csv.reader

import csv

with open('data.csv', 'r', encoding='utf-8') as f:
    r = csv.reader(f,  skipinitialspace=True, strict=False)
    for row in r:
        print(f"{row}")

辞書として読込 → csv.DictReader

import csv

with open('data.csv', 'r', encoding='utf-8') as f:
    r = csv.DictReader(f, skipinitialspace=True)
    for row in r:
        print(row.get('A'))

BOM付きのCSV
csv.reader は、 encoding='utf-8' で読めるようだが、csv.DictReader では、
BOM付きは、encoding='utf-8-sig'
としないと読むことができない。

ファイルがBOM付きかチェックする

def is_utf8_file_with_bom(filename:str)->bool:
    line = open(filename, encoding='utf-8').readline()
    return line[0] == '\ufeff'

Java では、この utf-8-sig にあたる BOM付きであることを示す文字セットの定義がない。