If you substitute a safe placeholder (one that won't match an existing string in the csv file) for a bare pair of double quotes ("") before parsing, you can then substitute back once parsed and identify strings that have a single occurrence of the placeholder:
import csv
lines = [
'"row1_col1","row1_col2 with ""embedded"" quotes",3,"",,"row1_col6"',
'"row2_col1","row2_col2",3,"",,"row2_col6"',
]
lines = [line.replace('""', '__PAIR_OF_DOUBLE_QUOTES__') for line in lines]
csv_reader = csv.reader(lines, delimiter=',')
rows = []
for row in csv_reader:
for col in range(len(row)):
# empty string is null/none
if row[col] == '':
row[col] = None
# string with just a pair of double quotes is the empty string
elif row[col] == '__PAIR_OF_DOUBLE_QUOTES__':
row[col] = ''
else:
row[col] = row[col].replace('__PAIR_OF_DOUBLE_QUOTES__', '"')
rows.append(row)
This results in the following output:
>>> print(json.dumps(rows))
[
["row1_col1", "row1_col2 with \"embedded\" quotes", "3", "", null, "row1_col6"],
["row2_col1", "row2_col2", "3", "", null, "row2_col6"]
]