【问题标题】:Iterate through lines of a text file and perform certain operations遍历文本文件的行并执行某些操作
【发布时间】:2019-02-26 17:05:36
【问题描述】:

我有一个包含以下两行文本的测试文件:

( PIN  700_start_stop( STS_PROP( POS_X 123 )( POS_Y 456 )( BIT_CNT 1 )( 
CNCT_ID 7071869 ))(USR_PROP( VAR 1( Var_typ  -1 )(AssocCd H12 )( termLBLtmc  
+S))

( PIN  700_start_stop( STS_PROP( POS_X 123 )( POS_Y 456 )( BIT_CNT 1 )( 
CNCT_ID 7071869 ))(USR_PROP( VAR 1( Var_typ  -1 )(AssocCd H12 )( termLBLtmc  
+S))

它们存储在名为“test.txt”的文本文件中

我正在尝试遍历文本文件的每一行,并使用正则表达式将我想要的信息推送到熊猫数据框中(不是正则表达式问题,我有)。出于某种原因,我只能从一行中获取信息,而不是全部。以下是我的想法:

import re
import pandas as pd

df1 = pd.DataFrame()

with open(r'C:\Users\User1\Documents\Python Scripts\test.txt', 'r') as txt:

for each_line in txt:
    line=txt.read().replace('\n','') # convert line to type str

    re1='.*?'   # Non-greedy match on filler
    re2='(\\d+)'    # Integer Number 1
    re3='((?:[a-z][a-z0-9_]*))' # Variable Name 1

    rg = re.compile(re1+re2+re3,re.IGNORECASE|re.DOTALL)
    m = rg.search(line)
    if m:
        int1=m.group(1)
        var1=m.group(2)
        print ("("+int1 + var1+")"+"\n")
        df1[df1.iloc(), 'Name'] = "("+int1 + var1+")"+"\n"

理想情况下,该文件的打印输出应该是:

>>(700_start_stop)
>>(700_start_stop)

数据框应如下所示:

 index          Name
   0     (700_start_stop)
   1     (700_start_stop)

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    所以,我查看了代码并编写了一个更简单的版本。它现在可以正常工作了。

    import re
    import pandas as pd
    
    df1 = pd.DataFrame(columns = ["Name"])
    
    with open('test.txt', 'r') as fi:
        for line in fi:
            line = line.strip()
            rg = re.compile(r'.*?(\d+[a-z_]+)', re.IGNORECASE)
            m = rg.search(line)
            if m:
                df1 = df1.append({"Name" : m[1]}, ignore_index=True)
    
    print(df1)
    

    【讨论】:

    • 您的正则表达式很难阅读。我使用 regex101.com 来测试正则表达式并任意拆分它很少有助于提高可读性(除非你有一个 100 个字符长的正则表达式......)。
    • .*? = 非贪婪运算符,括号表示捕获组,其余部分与您所拥有的非常相似。
    • m[1] 与 m.group(1) 相同。
    • .*?(\d+)([a-z_]+) 使用多组括号创建多个组。
    • 您可以通过扩展字典来添加其他列。所以不是"Name" : m[1] 而是"Name" : m[1], "age": m[2]
    【解决方案2】:

    文件对象的 for 循环遍历其行。 不要那样做:

    line=txt.read().replace('\n','')
    

    丢弃该行并进行更改:

    m = rg.search(line)
    

    m = rg.search(each_line)
    

    "each_line" 是文件对象每次迭代中的当前行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多