无法提取文件

时间:2017-06-29 10:18:59

标签: python file

我正在尝试在Python中执行一个读取文件(A.out)的脚本,当它检测到关键字时,会开始将文件A.out复制到B.out

文件A.out类似于:

 CYCLE:   194 TIME:   0.025 TIME LEFT:  2.00D  GRAD.:     1.872 HEAT: -420.1845
 CYCLE:   195 TIME:   0.025 TIME LEFT:  2.00D  GRAD.:     2.232 HEAT: -420.1653
 CYCLE:   196 TIME:   0.025 TIME LEFT:  2.00D  GRAD.:     1.981 HEAT: -420.1703


          EXCESS NUMBER OF OPTIMIZATION CYCLES


          CURRENT VALUE OF GRADIENT NORM =    1.890706

          CURRENT VALUE OF GEOMETRY




  C    -2.05768505 +1   4.28867630 +1   0.07135650 +1
  O    -0.75590874 +1   4.69719052 +1  -0.38910531 +1
  H    -0.78776710 +1   4.91862889 +1  -1.39007889 +1
  C    -2.73026659 +1   3.32072929 +1  -0.89832955 +1

# it ends here

我制作的剧本应该找到“几何的当前价值”#34;之后4行开始复制来自" A"到" B"。但它没有用。 代码是:

import os

from os.path import exists, splitext


def out_to_mop_let (fileA, fileB, keywords=""):
    fileA="A.out"
    fileB="B.out"
    filein=open(fileA, "r")
    fileout=open(fileB, "w")
    lines = filein.readlines()
    filein.close()

    lstart = None
    lfinish = None

    for lindex in range(0,len(lines)):
        if lindex-4>lstart and lines[lindex]=='\n' and lfinish==None and lstart!=None:
            lfinish=lindex+1
        if " CURRENT VALUE OF GEOMETRY" in lines[lindex]:
            lstart=lindex 
    print lstart
    print lfinish
    fileout.write(keywords + "\n\n\n")
    for lindex in range(lstart+4,lfinish):
        fileout.write(lines[lindex])

    fileout.close()
    filein.close()

但是当我执行它时,终端返回:

    for lindex in range(lstart+4,lfinish):
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我不知道如何修复它。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

这个更短,更pythonic:

with open('A.out') as fin, open('B.out', 'w') as fout:
    for line in fin:
        if line.strip() == 'CURRENT VALUE OF GEOMETRY':
            break
    for line in fin:
        if line.strip():
            fout.write(line)

说明

建议在打开文件时使用with语句。 这创造了一个所谓的背景。只要您感到高兴,即离开上下文,文件就会自动关闭。

在这里,我使用一个with语句打开源文件和目标文件。 两人都将在离开背景时关闭。

文件对象是一个迭代器,允许使用for循环直接迭代。 使用line.strip()删除任何前导和尾随空格。 只要您在清理的广告系列上看到CURRENT VALUE OF GEOMETRY,就会切换到其他模式并开始将所有非空行从A.out复制到B.out

答案 1 :(得分:0)

你将lfinish设置为None,然后尝试对它进行算术运算,这不起作用。

一种可能的解决方案是:

def from_A_to_B (Aout, Bout):
    filein=open(Aout, "r")
    fileout=open(Bout, "w")
    lines = filein.readlines()

    found = False
    for line in lines:
        if not found and "CURRENT VALUE OF GEOMETRY" in line:
            found = True
        elif found:
            fileout.write(line)

    fileout.close()
    filein.close()