Skip to content

Commit 1e61a90

Browse files
author
Oleh Kozynets
committed
Move parameter validation to a separate function.
1 parent 018da9d commit 1e61a90

File tree

1 file changed

+58
-104
lines changed

1 file changed

+58
-104
lines changed

pandas/io/parsers.py

+58-104
Original file line numberDiff line numberDiff line change
@@ -600,97 +600,7 @@ def read_csv(
600600
float_precision=None,
601601
storage_options: StorageOptions = None,
602602
):
603-
# gh-23761
604-
#
605-
# When a dialect is passed, it overrides any of the overlapping
606-
# parameters passed in directly. We don't want to warn if the
607-
# default parameters were passed in (since it probably means
608-
# that the user didn't pass them in explicitly in the first place).
609-
#
610-
# "delimiter" is the annoying corner case because we alias it to
611-
# "sep" before doing comparison to the dialect values later on.
612-
# Thus, we need a flag to indicate that we need to "override"
613-
# the comparison to dialect values by checking if default values
614-
# for BOTH "delimiter" and "sep" were provided.
615-
if dialect is not None:
616-
sep_override = (delimiter is None) and (sep is lib.no_default or sep == ",")
617-
kwds = dict(sep_override=sep_override)
618-
else:
619-
kwds = dict()
620-
621-
# Alias sep -> delimiter.
622-
if delimiter is None:
623-
delimiter = sep
624-
625-
if delim_whitespace and (delimiter is not lib.no_default):
626-
raise ValueError(
627-
"Specified a delimiter with both sep and "
628-
"delim_whitespace=True; you can only specify one."
629-
)
630-
631-
if delimiter is lib.no_default:
632-
# assign default separator value
633-
delimiter = ","
634-
635-
if engine is not None:
636-
engine_specified = True
637-
else:
638-
engine = "c"
639-
engine_specified = False
640-
641-
kwds.update(
642-
delimiter=delimiter,
643-
engine=engine,
644-
dialect=dialect,
645-
compression=compression,
646-
engine_specified=engine_specified,
647-
doublequote=doublequote,
648-
escapechar=escapechar,
649-
quotechar=quotechar,
650-
quoting=quoting,
651-
skipinitialspace=skipinitialspace,
652-
lineterminator=lineterminator,
653-
header=header,
654-
index_col=index_col,
655-
names=names,
656-
prefix=prefix,
657-
skiprows=skiprows,
658-
skipfooter=skipfooter,
659-
na_values=na_values,
660-
true_values=true_values,
661-
false_values=false_values,
662-
keep_default_na=keep_default_na,
663-
thousands=thousands,
664-
comment=comment,
665-
decimal=decimal,
666-
parse_dates=parse_dates,
667-
keep_date_col=keep_date_col,
668-
dayfirst=dayfirst,
669-
date_parser=date_parser,
670-
cache_dates=cache_dates,
671-
nrows=nrows,
672-
iterator=iterator,
673-
chunksize=chunksize,
674-
converters=converters,
675-
dtype=dtype,
676-
usecols=usecols,
677-
verbose=verbose,
678-
encoding=encoding,
679-
squeeze=squeeze,
680-
memory_map=memory_map,
681-
float_precision=float_precision,
682-
na_filter=na_filter,
683-
delim_whitespace=delim_whitespace,
684-
warn_bad_lines=warn_bad_lines,
685-
error_bad_lines=error_bad_lines,
686-
low_memory=low_memory,
687-
mangle_dupe_cols=mangle_dupe_cols,
688-
infer_datetime_format=infer_datetime_format,
689-
skip_blank_lines=skip_blank_lines,
690-
storage_options=storage_options,
691-
)
692-
693-
return _read(filepath_or_buffer, kwds)
603+
return _check_defaults_read(locals(), {"delimiter": ","})
694604

695605

696606
@Appender(
@@ -759,19 +669,7 @@ def read_table(
759669
memory_map=False,
760670
float_precision=None,
761671
):
762-
# TODO: validation duplicated in read_csv
763-
if delim_whitespace:
764-
if (delimiter is not None) or (sep is not lib.no_default):
765-
raise ValueError(
766-
"Specified a delimiter with both sep and "
767-
"delim_whitespace=True; you can only specify one."
768-
)
769-
else:
770-
if sep is lib.no_default:
771-
# assign default delimeter value
772-
sep = "\t"
773-
774-
return read_csv(**locals())
672+
return _check_defaults_read(locals(), {"delimiter": "\t"})
775673

776674

777675
def read_fwf(
@@ -3786,3 +3684,59 @@ def _make_reader(self, f):
37863684
self.skiprows,
37873685
self.infer_nrows,
37883686
)
3687+
3688+
3689+
def _check_defaults_read(read_kwds: dict, defaults: dict):
3690+
"""Check default values of input parameters, read a line file."""
3691+
engine = read_kwds["engine"]
3692+
dialect = read_kwds["dialect"]
3693+
delimiter = read_kwds["delimiter"]
3694+
delim_whitespace = read_kwds["delim_whitespace"]
3695+
filepath_or_buffer = read_kwds["filepath_or_buffer"]
3696+
sep = read_kwds["sep"]
3697+
3698+
del read_kwds["filepath_or_buffer"]
3699+
del read_kwds["sep"]
3700+
3701+
delimiter_default = defaults["delimiter"]
3702+
3703+
# gh-23761
3704+
#
3705+
# When a dialect is passed, it overrides any of the overlapping
3706+
# parameters passed in directly. We don't want to warn if the
3707+
# default parameters were passed in (since it probably means
3708+
# that the user didn't pass them in explicitly in the first place).
3709+
#
3710+
# "delimiter" is the annoying corner case because we alias it to
3711+
# "sep" before doing comparison to the dialect values later on.
3712+
# Thus, we need a flag to indicate that we need to "override"
3713+
# the comparison to dialect values by checking if default values
3714+
# for BOTH "delimiter" and "sep" were provided.
3715+
if dialect is not None:
3716+
read_kwds["sep_override"] = (delimiter is None) and (
3717+
sep is lib.no_default or sep == delimiter_default
3718+
)
3719+
3720+
# Alias sep -> delimiter.
3721+
if delimiter is None:
3722+
delimiter = sep
3723+
3724+
if delim_whitespace and (delimiter is not lib.no_default):
3725+
raise ValueError(
3726+
"Specified a delimiter with both sep and "
3727+
"delim_whitespace=True; you can only specify one."
3728+
)
3729+
3730+
if delimiter is lib.no_default:
3731+
# assign default separator value
3732+
read_kwds["delimiter"] = delimiter_default
3733+
else:
3734+
read_kwds["delimiter"] = delimiter
3735+
3736+
if engine is not None:
3737+
read_kwds["engine_specified"] = True
3738+
else:
3739+
read_kwds["engine"] = "c"
3740+
read_kwds["engine_specified"] = False
3741+
3742+
return _read(filepath_or_buffer, read_kwds)

0 commit comments

Comments
 (0)