我正在尝试将一个格式奇怪的文本文件导入到pandas DataFrame中。以下是两个示例行:
LOADED LANE 1 MAT. TYPE= 2 LEFFECT= 1 SPAN= 200. SPACE= 10. BETA= 3.474 LOADEFFECT 5075. LMAX= 3643. COV= .13
LOADED LANE 1 MAT. TYPE= 3 LEFFECT= 1 SPAN= 200. SPACE= 10. BETA= 3.515 LOADEFFECT10009. LMAX= 9732. COV= .08
首先我尝试了以下方法:
df = pd.read_csv('beta.txt', header=None, delim_whitespace=True, usecols=[2,5,7,9,11,13,15,17,19])
看起来这个方法还行,但是当遇到上面的例子时出现了问题,在LOADEFFECT
字符串后没有空格(你可能需要向右滚动一下才能在例子中看到它)。我得到了如下结果:
632 1 2 1 200 10 3.474 5075. 3643. 0.13
633 1 3 1 200 10 3.515 LMAX= COV= NaN
然后我决定使用正则表达式来定义我的分隔符。经过多次尝试和错误(我不是正则表达式专家),我用以下代码实现了近似的效果:
df = pd.read_csv('beta.txt', header=None, sep='/s +|LOADED LANE|MAT. TYPE=|LEFFECT=|SPAN=|SPACE=|BETA=|LOADEFFECT|LMAX=|COV=', engine='python')
这个几乎可以工作,但似乎在一开始就创建了一个
NaN
列:632 NaN 1 2 1 200 10 3.474 5075 3643 0.13
633 NaN 1 3 1 200 10 3.515 10009 9732 0.08
此时,我认为我可以只删除第一列,并且这样做也没问题。然而,我想知道正确的设置正则表达式以便在一个步骤中正确解析该文本文件的方法是什么?有任何想法吗?除此之外,我相信还有更聪明的方法来解析这个文本文件。期待听到您的建议。
谢谢!
read_fwf
就像 DSM 所提到的那样,如果格式是固定宽度,它可以读取此内容。它接受一个width
参数,您可以通过该参数传递每个列宽的列表。 - EdChumread_fwf
这个函数,我觉得它可以解决我的问题! - marillionread_csv
中的“使用空格作为分隔符”选项。EdChum的建议是,只要我拥有的文件具有相同的固定宽度格式,就可以使用read_fwf
。 - marillion