使用 pd.read_csv 自动检测 CSV 文件中的分隔符
Auto-detect the delimiter in a CSV file using pd.read_csv
read_csv 有没有办法自动检测分隔符? numpy 的 genfromtxt 就是这样做的。我的文件包含单 space、双 space 和制表符作为分隔符的数据。 genfromtext() 解决了它,但比 pandas' read_csv 慢。有什么想法吗?
选项 1
使用delim_whitespace=True
df = pd.read_csv('file.csv', delim_whitespace=True)
选项 2
将正则表达式传递给sep
参数:
df = pd.read_csv('file.csv', sep='\s+')
这相当于第一个选项
为了更好地控制,我使用了 python 项目中名为 detect_delimiter 的 python 模块。参见 https://pypi.org/project/detect-delimiter/。它已经存在了一段时间。与所有代码一样,您应该在部署之前使用您的解释器进行测试。我已经测试了 python 版本 3.8.5.
请参阅下面的代码示例,其中会自动检测定界符,并且 var
分隔符是根据方法的输出定义的。然后代码读取 CSV 文件
带有 sep = 分隔符。我已经使用以下定界符进行了测试,尽管其他定界符应该可以工作:; , |
它不适用于多字符定界符,例如“,”
注意!此方法不会检测格式错误的 CSV 文件。在这种情况下
其中输入文件同时包含 ;和 ,方法 returns ,作为检测到的分隔符。
from detect_delimiter import detect
import pandas as pd
delimiter = ''
with open(security_rule_file.csv) as myfile:
firstline = myfile.readline()
delimiter = detect(firstline)
myfile.close()
records = pd.read_csv(security_rule_file.csv, sep = delimiter)
另一种选择是使用内置的 CSV 嗅探器。我将它与只读取一定数量的字节混合起来,以防 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
read_csv 有没有办法自动检测分隔符? numpy 的 genfromtxt 就是这样做的。我的文件包含单 space、双 space 和制表符作为分隔符的数据。 genfromtext() 解决了它,但比 pandas' read_csv 慢。有什么想法吗?
选项 1
使用delim_whitespace=True
df = pd.read_csv('file.csv', delim_whitespace=True)
选项 2
将正则表达式传递给sep
参数:
df = pd.read_csv('file.csv', sep='\s+')
这相当于第一个选项
为了更好地控制,我使用了 python 项目中名为 detect_delimiter 的 python 模块。参见 https://pypi.org/project/detect-delimiter/。它已经存在了一段时间。与所有代码一样,您应该在部署之前使用您的解释器进行测试。我已经测试了 python 版本 3.8.5.
请参阅下面的代码示例,其中会自动检测定界符,并且 var 分隔符是根据方法的输出定义的。然后代码读取 CSV 文件 带有 sep = 分隔符。我已经使用以下定界符进行了测试,尽管其他定界符应该可以工作:; , |
它不适用于多字符定界符,例如“,”
注意!此方法不会检测格式错误的 CSV 文件。在这种情况下 其中输入文件同时包含 ;和 ,方法 returns ,作为检测到的分隔符。
from detect_delimiter import detect
import pandas as pd
delimiter = ''
with open(security_rule_file.csv) as myfile:
firstline = myfile.readline()
delimiter = detect(firstline)
myfile.close()
records = pd.read_csv(security_rule_file.csv, sep = delimiter)
另一种选择是使用内置的 CSV 嗅探器。我将它与只读取一定数量的字节混合起来,以防 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