从.txt(文本)文件中解析表格

问题描述 投票:0回答:1

我有一些来自python剖析器的剖析结果,如下所示。

Filename: main.py

Line #    Mem usage    Increment   Line Contents
================================================
    30    121.8 MiB    121.8 MiB   @profile(stream=f)
    31                             def parse_data(data):
    32    121.8 MiB      0.0 MiB       Y=data["price"].values
    33    121.8 MiB      0.0 MiB       Y=np.log(Y)
    34    121.8 MiB      0.0 MiB       features=data.columns
    35    121.8 MiB      0.0 MiB       X1=list(set(features)-set(["price"]))
    36    126.3 MiB      4.5 MiB       X=data[X1].values
    37    126.3 MiB      0.0 MiB       ss=StandardScaler()
    38    124.6 MiB      0.0 MiB       X=ss.fit_transform(X)
    39    124.6 MiB      0.0 MiB       return X,Y


Filename: main.py

Line #    Mem usage    Increment   Line Contents
================================================
    41    127.1 MiB    127.1 MiB   @profile(stream=f)
    42                             def linearRegressionfit(Xt,Yt,Xts,Yts):
    43    127.1 MiB      0.0 MiB       lr=LinearRegression()
    44    131.2 MiB      4.1 MiB       model=lr.fit(Xt,Yt)
    45    132.0 MiB      0.8 MiB       predict=lr.predict(Xts)
    46                             

现在,我需要获得这些结果用于绘图和其他用途。但这些文本不是很方便的东西。表中显示的是逐行剖析结果。如何获得pandas数据框架或表格版本?它可以用来获取这个表中的任何行或列。 ?

P.S. I have visited regexparsimonious 但似乎不能让它们在我的案例中使用。

python python-3.x text text-parsing memory-profiling
1个回答
1
投票

这只是一个小小的解析练习。通过标准的split()和一些小的调整,你可以在几行代码中得到一个非常干净的数据框架。

txt = '''
Filename: main.py

Line #    Mem usage    Increment   Line Contents
================================================
    30    121.8 MiB    121.8 MiB   @profile(stream=f)
    31                             def parse_data(data):
    32    121.8 MiB      0.0 MiB       Y=data["price"].values
    33    121.8 MiB      0.0 MiB       Y=np.log(Y)
    34    121.8 MiB      0.0 MiB       features=data.columns
    35    121.8 MiB      0.0 MiB       X1=list(set(features)-set(["price"]))
    36    126.3 MiB      4.5 MiB       X=data[X1].values
    37    126.3 MiB      0.0 MiB       ss=StandardScaler()
    38    124.6 MiB      0.0 MiB       X=ss.fit_transform(X)
    39    124.6 MiB      0.0 MiB       return X,Y


Filename: main.py

Line #    Mem usage    Increment   Line Contents
================================================
    41    127.1 MiB    127.1 MiB   @profile(stream=f)
    42                             def linearRegressionfit(Xt,Yt,Xts,Yts):
    43    127.1 MiB      0.0 MiB       lr=LinearRegression()
    44    131.2 MiB      4.1 MiB       model=lr.fit(Xt,Yt)
    45    132.0 MiB      0.8 MiB       predict=lr.predict(Xts)
'''

import pandas as pd

lines = []
for line in txt.split('\n'):
    #print(line)
    if line.startswith('Filename'): continue
    if line.startswith('Line'): continue
    if line.startswith('='): continue
    if line == '': continue
    data = [i.strip() for i in line.split()]
    #Fix def lines
    if data[1] == 'def':
        data = [data[0],'','','','',' '.join(data[1:4])]

    data = [data[0], ' '.join(data[1:3]), ' '.join(data[3:5]), data[-1]]
    lines.append(data)

df = pd.DataFrame(lines, columns=['Line #', 'Mem usage', 'Increment','Line Contents'])

print(df)

   Line #  Mem usage  Increment                            Line Contents
0      30  121.8 MiB  121.8 MiB                       @profile(stream=f)
1      31                                          def parse_data(data):
2      32  121.8 MiB    0.0 MiB                   Y=data["price"].values
3      33  121.8 MiB    0.0 MiB                              Y=np.log(Y)
4      34  121.8 MiB    0.0 MiB                    features=data.columns
5      35  121.8 MiB    0.0 MiB    X1=list(set(features)-set(["price"]))
6      36  126.3 MiB    4.5 MiB                        X=data[X1].values
7      37  126.3 MiB    0.0 MiB                      ss=StandardScaler()
8      38  124.6 MiB    0.0 MiB                    X=ss.fit_transform(X)
9      39  124.6 MiB    0.0 MiB                                      X,Y
10     41  127.1 MiB  127.1 MiB                       @profile(stream=f)
11     42                        def linearRegressionfit(Xt,Yt,Xts,Yts):
12     43  127.1 MiB    0.0 MiB                    lr=LinearRegression()
13     44  131.2 MiB    4.1 MiB                      model=lr.fit(Xt,Yt)
14     45  132.0 MiB    0.8 MiB                  predict=lr.predict(Xts)

然后你可以在以下情况下拆分数据框 '@profile' 是在 'Line Contents'.

比如说,你想解析整个文本,还是你有一个文本文件,想为每个表解析,这一点并不完全清楚。

split_idx = df[df['Line Contents'].str.startswith('@profile')].index
dataframes = []
for i, idx in enumerate(split_idx):
    try:
        dataframes.append(df.iloc[idx, split_idx[i+1]])
    except IndexError:
        dataframes.append(df.iloc[idx:])


print(dataframes[0])
print('======')
print(dataframes[1])

   Line #  Mem usage  Increment                            Line Contents
0      30  121.8 MiB  121.8 MiB                       @profile(stream=f)
1      31                                          def parse_data(data):
2      32  121.8 MiB    0.0 MiB                   Y=data["price"].values
3      33  121.8 MiB    0.0 MiB                              Y=np.log(Y)
4      34  121.8 MiB    0.0 MiB                    features=data.columns
5      35  121.8 MiB    0.0 MiB    X1=list(set(features)-set(["price"]))
6      36  126.3 MiB    4.5 MiB                        X=data[X1].values
7      37  126.3 MiB    0.0 MiB                      ss=StandardScaler()
8      38  124.6 MiB    0.0 MiB                    X=ss.fit_transform(X)
9      39  124.6 MiB    0.0 MiB                                      X,Y
10     41  127.1 MiB  127.1 MiB                       @profile(stream=f)
11     42                        def linearRegressionfit(Xt,Yt,Xts,Yts):
12     43  127.1 MiB    0.0 MiB                    lr=LinearRegression()
13     44  131.2 MiB    4.1 MiB                      model=lr.fit(Xt,Yt)
14     45  132.0 MiB    0.8 MiB                  predict=lr.predict(Xts)
======
   Line #  Mem usage  Increment                            Line Contents
10     41  127.1 MiB  127.1 MiB                       @profile(stream=f)
11     42                        def linearRegressionfit(Xt,Yt,Xts,Yts):
12     43  127.1 MiB    0.0 MiB                    lr=LinearRegression()
13     44  131.2 MiB    4.1 MiB                      model=lr.fit(Xt,Yt)
14     45  132.0 MiB    0.8 MiB                  predict=lr.predict(Xts)

0
投票

并不完全清楚你是想解析整个文本 还是每个表都有一个文本文件,想解析表。

如果你想从每个表创建一个pandas数据框,使用 skiprows 参数为 read_fwf 应该是可行的(这将跳过文件中的非标准行,但解析其余部分)。在这里,我将第一个表的内容存储在一个文件中 sample-1.txt 并用 read_fwf.

import pandas

df = pandas.read_fwf('sample-1.txt', skiprows=[1])

这就给出了下面的数据框架。

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
Line #           10 non-null int64
Mem usage        9 non-null object
Increment        9 non-null object
Line Contents    10 non-null object
dtypes: int64(1), object(3)
memory usage: 392.0+ bytes

如果你想把它分割成不同的表格,你必须在每次提到 Filename: main.py.

© www.soinside.com 2019 - 2024. All rights reserved.