如何让pd.read_csv()匹配Excel识别的自定义分隔符处理德产txt数据?
解决德国设备生成的自定义分隔符TXT文件的Pandas读取问题
我有多个德国设备生成的.txt数据文件,想用Python而非Excel绘图。文件用逗号作为小数分隔符(可通过设置decimal=','解决),但列分隔符是自定义类型,既非普通制表符也非空格。试过Python里的常规分隔符,包括让pandas自动识别(留空sep),都无法成功拆分列,但Excel选择「自定义」分隔符能正常导入。现在想在pd.read_csv()中实现同样的列拆分效果。
尝试的代码
import os import glob import pandas as pd import io gdh_pms = [] os.chdir(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\tga\txt") for leggernaam in glob.glob("*.txt"): with open(leggernaam, mode='rb') as fp: data = fp.read() stroom = io.StringIO(data.decode('ansi')) df = pd.read_csv(stroom, skiprows=10, skipfooter=8, engine='python', sep='\t', decimal=',') df['origin'] = leggernaam gdh_pms.append(df) os.chdir(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\tga")
当前运行结果
8 31,333 4,63395 origin 0 9 31,500 4,6333 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 1 10 31,667 4,63265 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 2 11 31,833 4,63207 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 3 12 32,000 4,63107 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 4 13 32,167 4,63013 PLA 0_gdh_30_200°C_Air_090823_DSC.txt ... ... ... 998 1007 197,833 4,44944 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 999 1008 198,000 4,44985 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 1000 1009 198,167 4,45055 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 1001 1010 198,333 4,45132 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 1002 1011 198,500 4,45206 PLA 0_gdh_30_200°C_Air_090823_DSC.txt 1003 rows × 2 columns
解决方案
这类自定义分隔符通常是多个连续空格或制表符+空格的混合,可以用正则表达式作为分隔符解决:
修改pd.read_csv()的sep参数为正则表达式\s+,匹配一个或多个空白字符(包括空格、制表符等),即可实现和Excel自定义分隔符一致的拆分效果:
import os import glob import pandas as pd import io gdh_pms = [] os.chdir(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\tga\txt") for leggernaam in glob.glob("*.txt"): with open(leggernaam, mode='rb') as fp: data = fp.read() stroom = io.StringIO(data.decode('ansi')) # 用正则\s+匹配任意空白字符作为分隔符 df = pd.read_csv(stroom, skiprows=10, skipfooter=8, engine='python', sep=r'\s+', decimal=',') df['origin'] = leggernaam gdh_pms.append(df) os.chdir(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\tga")
补充说明
sep=r'\s+':正则表达式,匹配一个或多个连续空白字符,完美适配这类自定义分隔场景- 保留
decimal=','确保逗号作为小数分隔符被正确识别 - 如果
\s+仍无法解决,可先读取一行原始数据查看具体分隔符:
若为固定数量空格或特殊字符,直接指定对应分隔符即可。with open(leggernaam, mode='rb') as fp: first_line = fp.readline().decode('ansi') print(repr(first_line)) # 用repr查看原始字符,定位具体分隔符
内容的提问来源于stack exchange,提问作者Philip de Bruin
相关产品推荐
相关产品推荐

