【发布时间】:2015-06-30 11:34:39
【问题描述】:
我正在尝试将格式奇怪的文本文件导入 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参数,您可以在其中传递每个列宽的列表 -
@DSM 是的,我认为它是一个固定宽度的格式文件。
-
@EdChum 我不知道
read_fwf我想这会解决我的问题! -
也不确定,但您最初的问题可能与行尾有关? “\r\n”与“\n”