【问题标题】:Replace space of a specific position in a text file with NA用 NA 替换文本文件中特定位置的空格
【发布时间】:2018-05-20 05:48:25
【问题描述】:

我有一个这样的 TEXT 文件-

sfdfd
kgfkhgjk
fsdfs
sgsgggggfsdf

Node: RBS6301 CXP102051/26_R30F L17A.4-6 (C17.0_LSV198_PA24)

=================================
col1 clo2 clo3
=================================
1   avb wer21g2
---------------------------------

    =================================
empcode   Emnname   Date       DESC
12d      sf        2018-02-06      dghsjf  hfhgf jfjh
asf2     asdfw2    2018-02-16      fsfsfg  jhjhhjghk
dsf21    sdf2      2016-02-06      sdgfsgf
sdgg     dsds      dkfd-sffddfdf   aaaa
dfd      gfg       dfsdffd         aaaa
df                 dfdf            efefkhgvkjgjk kgkjjk
4fr                                freff klhlkkl
-----------------------------------

hfjh
vkgjlbljkbkjbk/n/l  jhfjhfhj kutiugjm iugiuk
hfhj
fggggggggggggggggggggggg

从上面我使用 -

提取了以下部分
import pandas as pd
import csv

findStr = 'empcode   Emnname'
EndStr = '-----------------------------------'
tmp1 = []
tmp = []
tmp2=[]
with open('test123.txt') as f:
    out = []
    for line in f:
        if line.startswith(findStr):
            tmp.append(re.findall('\w+',line.strip()))

            for line in f:
                if line.rstrip()==EndStr:
                    out.append(tmp)
                    break
                tmp.append(re.sub('\s',' ',line.strip()))

f.close()

tmp O/P-

[['empcode', 'Emnname', 'Date', 'DESC'],
 '12d      sf        2018-02-06      dghsjf  hfhgf jfjh',
 'asf2     asdfw2    2018-02-16      fsfsfg  jhjhhjghk',
 'dsf21    sdf2      2016-02-06      sdgfsgf',
 'sdgg     dsds      dkfd-sffddfdf   aaaa',
 'dfd      gfg       dfsdffd         aaaa',
 'df                 dfdf            efefkhgvkjgjk kgkjjk',
 '4fr                                freff klhlkkl']

但是,我希望 NA 在空白区域中。即在 gfg 之下或 4fr 之后。任何人都可以请帮忙。应该是——

[['empcode', 'Emnname', 'Date', 'DESC'],
 '12d      sf        2018-02-06      dghsjf  hfhgf jfjh',
 'asf2     asdfw2    2018-02-16      fsfsfg  jhjhhjghk',
 'dsf21    sdf2      2016-02-06      sdgfsgf',
 'sdgg     dsds      dkfd-sffddfdf   aaaa',
 'dfd      gfg       dfsdffd         aaaa',
 'df       NA        dfdf            efefkhgvkjgjk kgkjjk',
 '4fr      NA        NA              freff klhlkkl']

【问题讨论】:

    标签: python pandas csv text


    【解决方案1】:

    使用 re 提取您要查找的部分并利用 Pandas read_fwf 固定宽度阅读器。

    import re
    import pandas as pd
    
    pat = '(empcode   Emnname(.|\n)*)-----------------------------------'
    txt = re.findall(pat, open('test123.txt').read())[0][0]
    h, b = txt.split('\n', 1)
    df = pd.read_fwf(pd.io.common.StringIO(b), header=None, names=h.split())
    df
    
      empcode Emnname           Date                  DESC
    0     12d      sf     2018-02-06    dghsjf  hfhgf jfjh
    1    asf2  asdfw2     2018-02-16     fsfsfg  jhjhhjghk
    2   dsf21    sdf2     2016-02-06               sdgfsgf
    3    sdgg    dsds  dkfd-sffddfdf                  aaaa
    4     dfd     gfg        dfsdffd                  aaaa
    5      df     NaN           dfdf  efefkhgvkjgjk kgkjjk
    6     4fr     NaN            NaN         freff klhlkkl
    

    如果出于某种原因 OP 实际上想要列表输出

    [df.columns.tolist()] + df.to_string(header=None, index=None).splitlines()
    
    [['empcode', 'Emnname', 'Date', 'DESC'],
     '12d      sf     2018-02-06    dghsjf  hfhgf jfjh',
     ' asf2  asdfw2     2018-02-16     fsfsfg  jhjhhjghk',
     'dsf21    sdf2     2016-02-06               sdgfsgf',
     ' sdgg    dsds  dkfd-sffddfdf                  aaaa',
     '  dfd     gfg        dfsdffd                  aaaa',
     '   df     NaN           dfdf  efefkhgvkjgjk kgkjjk',
     '  4fr     NaN            NaN         freff klhlkkl']
    

    【讨论】:

    • 谢谢。它起作用了。您能否详细说明 [0][0] 和 h, b = txt.split('\n', 1) 以便更好地理解。
    • findall 查找该模式的所有实例。如果您自己运行它,您会看到它嵌入了我正在寻找的列表中。的元组。我有两组括号,因此是元组。查找re.findall 的文档。此外,h, b = txt.split('\n', 1) 表示,将名为txt 的字符串拆分为换行符一次。将拆分的第一部分分配给h,将第二部分分配给bh 是标题,b 是正文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多