Using pandas.read_csv with on_bad_lines='warn' option for lines with too many
columns delimiters, it work well, bad lines are not loaded and stderr catch the bad lines
numbers:
import pandas as pd
from io import StringIO
data = StringIO("""
nom,f,nb
bat,F,52
cat,M,66,
caw,F,15
dog,M,66,,
fly,F,61
ant,F,21""")
df = pd.read_csv(data, sep=',', on_bad_lines='warn')
# b'Skipping line 4: expected 3 fields, saw 4\nSkipping line 6: expected 3 fields, saw 5\n'
df.head(10)
# nom f nb
# 0 bat F 52
# 1 caw F 15
# 2 fly F 61
# 3 ant F 21
But in case the number of delimiter (here sep=,) is less than the main, the line
is added adding NaN.:
import pandas as pd
from io import StringIO
data = StringIO("""
nom,f,nb
bat,F,52
catM66,
caw,F,15
dog,M66
fly,F,61
ant,F,21""")
df = pd.read_csv(data, sep=',', on_bad_lines='warn', dtype=str)
df.head(10)
# nom f nb
# 0 bat F 52
# 1 catM66 NaN NaN <==
# 2 caw F 15
# 3 dog M66 NaN <==
# 4 fly F 61
# 5 ant F 21
Is there a way to make read_csv to not add lines with less columns delimiters than
the main lines ?
Note: I'm in a context of loading real big data files (e.g. hundred of millions of
lines, so the idea is not to propose any upfront grep/sed/awk processing but to take
benefit of fast read_csv bulk_load)