24小时热门版块排行榜    

查看: 1137  |  回复: 3

李平lp2012

铜虫 (小有名气)

[求助] python提取信息求助 已有1人参与

请教一个问题,Gaussian计算的结果文件*.log, 想要从中提取信息,比如优化后的分子坐标。想法是,先定位最后一个优化的坐标的位置,然后再提取。定位的语言如下:

block1=\'Standard orientation\'
block2=\'Rotational constants\'

with open(\'./1-1.log\') as f1:
    txt=f1.readlines()
    for line in txt:
      if line.find(block1) > -1:
         Loc=txt.index(line)
         print(Loc)

但现在有两个问题:
(1)如果我定位的关键词是block1‘Standard orientation’,则以我的例子来说,并没有一行一行循环,
输出的的是第一次出现Standard orientation的位置;(533)为什么呢?
(2)如果我定位的关键词是block2‘Rotational constants’,相同的程序,只是改为block2,则循环了,输出出现关键词的每一行的index,但是奇怪的是本来在1-1.log中有14个block2,但只最后输出的两个index相同,即并没有定位到最后一个出现block2的位置:
573
1522
2052
2620
3187
3755
4321
4887
5453
6019
6586
7153
7720
7720为什么呢?
还有就是相同的语言,为什么不同的关键字会出现以上情况呢?

附件是我上传的1-1.log文件

谢谢
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 1-1.log
  • 2018-02-08 16:33:16, 572.76 K

» 猜你喜欢

» 本主题相关商家推荐: (我也要在这里推广)

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

天下客少年

铜虫 (初入文坛)

【答案】应助回帖


感谢参与,应助指数 +1
jjdg: 金币+1, 感谢参与 2018-02-11 16:54:03
你的代码的问题出现在求解Loc的语句,你的代码为
Loc=txt.index(line)
是在txt列表中寻找值为line的索引,而txt变量根据定义可以知道它是文件中的行数据,line变量根据for循环定义为txt列表中的值,你的Loc的计算语句计算的是你需要定位的关键词在文件的每行数据中的位置,并不是在全部文件中的位置,所以你求解block1的输出结果为14个533,而block2的输出结果为
573
1522
2052
2620
3187
3755
4321
4887
5453
6019
6586
7153
7720
7720
这14个数值,程序的输出是没有错误的,
根据你的意思你应该是要定位关键词在全部文章中的位置索引,我的理解,增加一个变量用来保存上面几行数据的长度,然后输出时将Loc加上这个长度就可以了。
2楼2018-02-10 10:53:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李平lp2012

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by 天下客少年 at 2018-02-10 10:53:18
你的代码的问题出现在求解Loc的语句,你的代码为
Loc=txt.index(line)
是在txt列表中寻找值为line的索引,而txt变量根据定义可以知道它是文件中的行数据,line变量根据for循环定义为txt列表中的值,你的Loc的计算 ...

(1)对,我的目的是定位关键字所在的line number。txt的变量是文件中的行数据,是该列表的值;line变量应该是这个值中的字符;

(2)Loc语句计算的并不是关键字在每行数据中的位置,这点是肯定的。因为(1)对于block1,533就是该关键字出现的line number-1, 而对于block2来说,数据就是该关键字每次出现的line number-1(2)我的计算是循环,所以关键字是每行出现的位置是一样的,而且比如block1值在该行中的位置也不是533.(可在log文件中验证)所以同样的循环结构,为什么两个不同关键字结果不同?而且我是做了for循环的,为什么像block1感觉是没有做循环呢?

(3)如果我没定位关键字出现的位置,怎么计算该关键字出现前N行的长度呢?
谢谢
3楼2018-02-12 18:30:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

天下客少年

铜虫 (初入文坛)

【答案】应助回帖

引用回帖:
3楼: Originally posted by 李平lp2012 at 2018-02-12 18:30:51
(1)对,我的目的是定位关键字所在的line number。txt的变量是文件中的行数据,是该列表的值;line变量应该是这个值中的字符;

(2)Loc语句计算的并不是关键字在每行数据中的位置,这点是肯定的。因为(1)对 ...

非常不好意思,我原来理解错了,实际上你第一个关键词的输出结果全部是533的原因是你的源文件中含有第一个关键词的几个line变量是相同的,而Loc=txt.index(line)这条语句只会返回找到的第一个值得索引,所以输出始终是533,第二个关键词最后两个得输出结果相同也是这个原因。举个例子:一个列表a=[1,2,3,4,5,1,2,6,1],则a.index(1)语句的输出结果为0,这个结果是固定的不管列表a中有几个数值1.
修改方法:
新增一个记录行数的变量(或者直接使用Loc这个变量)
block1 = 'Standard orientation'
block2 = 'Rotational constants'

with open('./1-1.log') as f1:
    txt = f1.readlines()
    Loc=0
    for line in txt:
        Loc += 1
        if line.find(block1) > 0:
            print(Loc)
但是要记住这个得到的函数是从1开始数的,所以最后的print语句最好改为print(Loc-1)
4楼2018-02-22 14:48:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 Ping_NUPT 的主题更新
信息提示
请填处理意见