【问题标题】:Use Multiple Character Delimiter in Python Pandas read_csv在 Python Pandas 中使用多个字符分隔符 read_csv
【发布时间】:2015-09-20 13:53:40
【问题描述】:

看来 pandas read_csv 函数只允许使用单个字符分隔符/分隔符。有没有办法允许使用字符串,例如“*|*”或“%%”?

【问题讨论】:

  • 为什么要不止一个?
  • 因为我有几列包含未格式化的文本,其中可以包含诸如“|”、“\t”、“”等字符。有人键入“%%”的可能性要低得多。 ..
  • 在野外的数据文件中发现了这个,因为 \t 被一些 linter 替换为 4 个空格。

标签: python python-2.7 csv pandas


【解决方案1】:

正如 Padraic Cunningham 在上面的评论中所写,目前还不清楚您为什么想要这个。 Wiki entry for the CSV Spec 声明关于分隔符:

...由分隔符分隔(通常是单个保留字符,例如逗号、分号或制表符;有时分隔符可能包含可选空格),

csv 模块和pandas 都不支持您的要求,这不足为奇。

但是,如果您真的想这样做,您几乎可以使用 Python 的字符串操作。以下示例显示了如何将数据框转换为“csv”,其中$$ 分隔线,%% 分隔列。

'$$'.join('%%'.join(str(r) for r in rec) for rec in df.to_records())

当然,您不必在将其写入文件之前将其转换为这样的字符串。

【讨论】:

    【解决方案2】:

    解决方案是使用 read_table 而不是 read_csv:

    1*|*2*|*3*|*4*|*5
    12*|*12*|*13*|*14*|*15
    21*|*22*|*23*|*24*|*25
    

    所以,我们可以这样阅读:

    pd.read_table('file.csv', header=None, sep='\*\|\*')
    

    【讨论】:

      【解决方案3】:

      Pandas 现在可以support multi character delimiters

      import panda as pd
      pd.read_csv(csv_file, sep="\*\|\*")
      

      【讨论】:

      • 需要注意的是,如果您指定多字符分隔符,解析引擎将在所有字段中查找您的分隔符,即使它们已被引用为文本。当引擎在带引号的字段中找到分隔符时,它将检测到分隔符,并且与其他行相比,您最终会在该行中获得更多字段,从而中断读取过程。
      • 请注意,从 Pandas 0.23.4 开始,read_csv() 支持多字符分隔符 to_csv does not support multi-character delimiters。原始帖子实际上询问了 to_csv()。 (旁注:显然,Markdown 不支持在链接中包含“()”)
      • 如果发帖者提及添加此功能的版本会有所帮助。
      【解决方案4】:

      不是pythonic方式,但绝对是一种编程方式,您可以使用这样的方式:

      import re
      
      def row_reader(row,fd):
          arr=[]
          in_arr = str.split(fd)
          i = 0
          while i < len(in_arr):
              if re.match('^".*',in_arr[i]) and not re.match('.*"$',in_arr[i]):
                  flag = True
                  buf=''
                  while flag and i < len(in_arr):
                      buf += in_arr[i]
                      if re.match('.*"$',in_arr[i]):
                          flag = False
                      i+=1
                      buf += fd if flag else ''
                  arr.append(buf)
              else:
                  arr.append(in_arr[i])
                  i+=1
          return arr
      
      with open(file_name,'r') as infile:
          for row in infile:
              for field in  row_reader(row,'%%'):
                  print(field)
      

      【讨论】:

        【解决方案5】:

        在 pandas 1.1.4 中,当我尝试使用多字符分隔符时,我收到以下消息:

        ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
        

        因此,为了能够使用多个字符分隔符,现代 解决方案似乎是在read_csv 参数中添加engine='python'(在我的情况下,我将它与sep='[ ]?; 一起使用)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-25
          • 2017-07-06
          • 2018-12-22
          • 2017-05-05
          • 1970-01-01
          • 1970-01-01
          • 2018-07-12
          • 1970-01-01
          相关资源
          最近更新 更多