@@ -794,10 +794,8 @@ def __init__(self, f, engine=None, **kwds):
794794
795795 _validate_skipfooter (kwds )
796796
797- if kwds .get ("dialect" ) is not None :
798- dialect = kwds ["dialect" ]
799- if dialect in csv .list_dialects ():
800- dialect = csv .get_dialect (dialect )
797+ dialect = _extract_dialect (kwds )
798+ if dialect is not None :
801799 kwds = _merge_with_dialect_properties (dialect , kwds )
802800
803801 if kwds .get ("header" , "infer" ) == "infer" :
@@ -3739,6 +3737,50 @@ def _refine_defaults_read(
37393737 return kwds
37403738
37413739
3740+ def _extract_dialect (kwds : Dict [str , Any ]) -> Optional [csv .Dialect ]:
3741+ """
3742+ Extract concrete csv dialect instance.
3743+
3744+ Returns
3745+ -------
3746+ csv.Dialect or None
3747+ """
3748+ if kwds .get ("dialect" ) is None :
3749+ return None
3750+
3751+ dialect = kwds ["dialect" ]
3752+ if dialect in csv .list_dialects ():
3753+ dialect = csv .get_dialect (dialect )
3754+
3755+ _validate_dialect (dialect )
3756+
3757+ return dialect
3758+
3759+
3760+ MANDATORY_DIALECT_ATTRS = (
3761+ "delimiter" ,
3762+ "doublequote" ,
3763+ "escapechar" ,
3764+ "skipinitialspace" ,
3765+ "quotechar" ,
3766+ "quoting" ,
3767+ )
3768+
3769+
3770+ def _validate_dialect (dialect : csv .Dialect ) -> None :
3771+ """
3772+ Validate csv dialect instance.
3773+
3774+ Raises
3775+ ------
3776+ ValueError
3777+ If incorrect dialect is provided.
3778+ """
3779+ for param in MANDATORY_DIALECT_ATTRS :
3780+ if not hasattr (dialect , param ):
3781+ raise ValueError (f"Invalid dialect { dialect } provided" )
3782+
3783+
37423784def _merge_with_dialect_properties (
37433785 dialect : csv .Dialect ,
37443786 defaults : Dict [str , Any ],
@@ -3757,30 +3799,11 @@ def _merge_with_dialect_properties(
37573799 -------
37583800 kwds : dict
37593801 Updated keyword arguments, merged with dialect parameters.
3760-
3761- Raises
3762- ------
3763- ValueError
3764- If incorrect dialect is provided.
37653802 """
37663803 kwds = defaults .copy ()
37673804
3768- # Any valid dialect should have these attributes.
3769- # If any are missing, we will raise automatically.
3770- mandatory_dialect_attrs = (
3771- "delimiter" ,
3772- "doublequote" ,
3773- "escapechar" ,
3774- "skipinitialspace" ,
3775- "quotechar" ,
3776- "quoting" ,
3777- )
3778-
3779- for param in mandatory_dialect_attrs :
3780- try :
3781- dialect_val = getattr (dialect , param )
3782- except AttributeError as err :
3783- raise ValueError (f"Invalid dialect { dialect } provided" ) from err
3805+ for param in MANDATORY_DIALECT_ATTRS :
3806+ dialect_val = getattr (dialect , param )
37843807
37853808 parser_default = _parser_defaults [param ]
37863809 provided = kwds .get (param , parser_default )
0 commit comments