def _import_phenolist_csv(f, has_header):
# Note: If a csv (1) contains commas in quoted cells and (2) doesn't have any line that starts with a quoted cell,
# then sometimes this makes very bad choices.
# In particular, if all lines have the same number of some other character (even a letter), that character might become the delimeter.
try:
dialect = csv.Sniffer().sniff(f.read(4096))
except Exception as exc:
raise PheWebError("Sniffing csv format failed. Check that your csv file is well-formed. If it is, try delimiting with tabs or semicolons.") from exc
if dialect.delimiter in string.ascii_letters or dialect.delimiter in string.digits:
raise PheWebError("Our csv sniffer decided that {!r} looks like the most likely delimiter in your csv file, but that's crazy.")
f.seek(0)
try:
rows = list(csv.reader(f, dialect))
except ValueError:
return None
num_cols = len(rows[0])
if has_header:
fieldnames, rows = rows[0], rows[1:]
if any(fieldname is None or fieldname == '' for fieldname in fieldnames):
if has_header == 'augment':
fieldnames = [i if fieldname is None else fieldname for i, fieldname in enumerate(fieldnames)]
else:
raise PheWebError('bad csv header')
assert len(set(fieldnames)) == len(fieldnames)
else:
fieldnames = list(range(num_cols))
return [{fieldnames[i]: row[i] for i in range(num_cols)} for row in rows]
评论列表
文章目录