在 Python Pandas 中使用多个字符分隔符 read_csv

Posted

技术标签:

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

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

【问题讨论】:

为什么要不止一个? 因为我有几列包含未格式化的文本,其中可以包含诸如“|”、“\t”、“”等字符。有人键入“%%”的可能性要低得多。 .. 在野外的数据文件中发现了这个,因为 \t 被一些 linter 替换为 4 个空格。 【参考方案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='[ ]?; 一起使用)

【讨论】:

以上是关于在 Python Pandas 中使用多个字符分隔符 read_csv的主要内容,如果未能解决你的问题,请参考以下文章

将整列整数转换为字符串,在 Pandas 中使用逗号分隔千位

使用分隔符 pandas python 将单元格连接成字符串

Python pandas:删除字符串中分隔符后的所有内容

如何在 Python Pandas 中使用逗号作为小数分隔符的浮点格式?

pandas将dataframe中的多个字符串数据列的内容使用自定义分隔符拼接起来并生成新的数据列(combinine multiple string columns of dataframe)

在Python中使用多个分隔符拆分字符串[重复]