code: def read_csvs(
      files_path: Union[str, Iterable[str]],
      separate_df: bool = False,
      **kwargs: Any,
  ) -> Union[pd.DataFrame, dict]:
      """Read multiple CSV files and return a dictionary of DataFrames, or
      one concatenated DataFrame.
  
      Args:
          files_path: The filepath pattern matching the CSV files.
              Accepts regular expressions, with or without `.csv` extension.
              Also accepts iterable of file paths.
          separate_df: If `False` (default), returns a single Dataframe
              with the concatenation of the csv files.
              If `True`, returns a dictionary of separate DataFrames
              for each CSV file.
          **kwargs: Keyword arguments to pass into the
              original pandas `read_csv`.
  
      Raises:
          JanitorError: If `None` provided for `files_path`.
          JanitorError: If length of `files_path` is `0`.
          ValueError: If no CSV files exist in `files_path`.
          ValueError: If columns in input CSV files do not match.
  
      Returns:
          DataFrame of concatenated DataFrames or dictionary of DataFrames.
      """
      # Sanitize input
      if files_path is None:
          raise JanitorError("`None` provided for `files_path`")
      if not files_path:
          raise JanitorError("0 length `files_path` provided")
  
      # Read the csv files
      # String to file/folder or file pattern provided
      if isinstance(files_path, str):
          dfs_dict = {
              os.path.basename(f): pd.read_csv(f, **kwargs)
              for f in glob(files_path)
          }
      # Iterable of file paths provided
      else:
          dfs_dict = {
              os.path.basename(f): pd.read_csv(f, **kwargs)
              for f in files_path
          }
      # Check if dataframes have been read
      if not dfs_dict:
          raise ValueError(
              "No CSV files to read with the given `files_path`"
          )
      # Concatenate the dataframes if requested (default)
      col_names = list(dfs_dict.values())[0].columns  # noqa: PD011
      if not separate_df:
          # If columns do not match raise an error
          for df in dfs_dict.values():  # noqa: PD011
              if not all(df.columns == col_names):
                  raise ValueError(
                      "Columns in input CSV files do not match."
                      "Files cannot be concatenated."
                  )
          return pd.concat(
              list(dfs_dict.values()),
              ignore_index=True,
              sort=False,  # noqa: PD011
              copy=False,
          )
      return dfs_dict
  
file_path: pyjanitor/janitor/io.py
imports: from __future__ import annotations
  import inspect
  import os
  import subprocess
  from collections import defaultdict
  from glob import glob
  from io import StringIO
  from itertools import chain
  from typing import TYPE_CHECKING, Any, Iterable, NamedTuple, Union
  import pandas
  from .errors import JanitorError
  from .utils import check, deprecated_alias, import_message
label_desc: Use image node_id 1 for calling a global function with example usage: read_csvs(files_path, separate_df) and returns: dfs_dict, pd