【问题标题】:Auto-detect the delimiter in a CSV file using pd.read_csv使用 pd.read_csv 自动检测 CSV 文件中的分隔符
【发布时间】:2018-02-18 12:33:07
【问题描述】:

有没有办法让 read_csv 自动检测分隔符? numpy 的 genfromtxt 就是这样做的。我的文件具有单空格、双空格和制表符作为分隔符的数据。 genfromtext() 解决了它,但比 pandas 的 read_csv 慢。有什么想法吗?

【问题讨论】:

    标签: python pandas csv delimiter


    【解决方案1】:

    另一种选择是使用内置的 CSV Sniffer。我将它与仅读取一定数量的字节混合在一起,以防 CSV 文件很大。

    import csv
    
    def get_delimiter(file_path, bytes = 4096):
        sniffer = csv.Sniffer()
        data = open(file_path, "r").read(bytes)
        delimiter = sniffer.sniff(data).delimiter
        return delimiter
    

    【讨论】:

      【解决方案2】:

      为了更好地控制,我使用 python 项目中名为 detect_delimiter 的 python 模块。见https://pypi.org/project/detect-delimiter/。它已经存在了一段时间。与所有代码一样,您应该在部署之前使用解释器进行测试。我已经测试到 python 版本 3.8.5。

      请参见下面的代码示例,其中自动检测分隔符,而 var 分隔符是从方法的输出中定义的。然后代码读取 CSV 文件 带 sep = 分隔符。我已经使用以下分隔符进行了测试,尽管其他分隔符应该可以: , |

      它不适用于多字符分隔符,例如“,”

      注意!此方法不会检测格式错误的 CSV 文件。在这种情况下 其中输入文件包含两者;并且,该方法返回 ,作为检测到的分隔符。

      from detect_delimiter import detect
      import pandas as pd
      
      with open(security_rule_file.csv) as myfile:
          firstline = myfile.readline()
      myfile.close()
      deliminter = detect(firstline)
      
      records = pd.read_csv(security_rule_file.csv, sep = delimiter)
      

      【讨论】:

      • 有一个错字,上面写着deliminter,应该写delimiter
      【解决方案3】:

      选项 1

      使用delim_whitespace=True

      df = pd.read_csv('file.csv', delim_whitespace=True)
      

      选项 2

      将正则表达式传递给sep 参数:

      df = pd.read_csv('file.csv', sep='\s+')
      

      这相当于第一个选项


      Documentation for pd.read_csv.

      【讨论】:

      • 太棒了。选项 #2 也适用于 csv 文件。
      • 如果有空格不能将一个字段与另一个字段分开,则这些选项都不起作用。例如,如果您有一个制表符分隔的文件,并且字段中存在空格,则您几乎必须执行sep='\t'
      • @AdrianKeister 是正确的,但问题涉及数字数据,所以我们应该没问题。但对于字符串数据,这是需要注意的。
      • 如果更清楚地表明我们只是在谈论数字数据,或者也为一般 csv 数据提供解决方案,这将很有用
      猜你喜欢
      • 2014-07-08
      • 2021-12-17
      • 2020-12-17
      • 2013-01-19
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多