@@ -794,10 +794,8 @@ def __init__(self, f, engine=None, **kwds):
794
794
795
795
_validate_skipfooter (kwds )
796
796
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 :
801
799
kwds = _merge_with_dialect_properties (dialect , kwds )
802
800
803
801
if kwds .get ("header" , "infer" ) == "infer" :
@@ -3739,6 +3737,50 @@ def _refine_defaults_read(
3739
3737
return kwds
3740
3738
3741
3739
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
+
3742
3784
def _merge_with_dialect_properties (
3743
3785
dialect : csv .Dialect ,
3744
3786
defaults : Dict [str , Any ],
@@ -3757,30 +3799,11 @@ def _merge_with_dialect_properties(
3757
3799
-------
3758
3800
kwds : dict
3759
3801
Updated keyword arguments, merged with dialect parameters.
3760
-
3761
- Raises
3762
- ------
3763
- ValueError
3764
- If incorrect dialect is provided.
3765
3802
"""
3766
3803
kwds = defaults .copy ()
3767
3804
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 )
3784
3807
3785
3808
parser_default = _parser_defaults [param ]
3786
3809
provided = kwds .get (param , parser_default )
0 commit comments