緩すぎる規定の RFC4180 だけのルールで厳しい場合がある。
csv.reader と csv.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'