在Python 3中基于行更改文本

时间:2015-11-08 02:11:18

标签: python python-3.x tkinter

我有一些文件需要在几行上进行更改,而它所在的行确定需要更改的内容。我已经查看了其他答案,但他们似乎假设整个文件中只需要更改一个字符,或者只需要更改一行。

我的文件如下:

%chk=C:/place/drive/stuff/thing/here/long/path/name/that/we/dont/need/We_need_this_part.gjf
%mem=1000MB
#pm3 scf=direct Opt=Modredun Test

Strucrtural optmization using pm3 G03, Gaussian 8, 2015/02/03

0 1
 C              
 N                  1            B1
 N                  1            B2    2            A1
 N                  1            B3    3            A2    2            D1    0
 C                  4            B4    1            A3    3            D2    0
 H                  3            B5    1            A4    2            D3    0
 H                  3            B6    1            A5    2

        D4    0

我需要摆脱路径,所以第一行只是%chk=We_need_this_part我后来还需要能够根据tkinter小部件的输入更改第2行和第5行,但我认为在我得到这个部分之后会相对简单。

这是我到目前为止所做的:

import shutil
import fileinput
import tkinter

##    window = tkinter.Tk()
##    window.title("Gaussian Cookbook")
##    window.mainloop()    

def fileFind():

#prompts user to navigate to desired file
    inFile = tkinter.filedialog.askopenfilename()
#prompts user to save new file under new name
    outFile = tkinter.filedialog.asksaveasfilename()
#copies contents of old file, to have needed changes applied,
#leaves user option to overwrite or create new file
    outFile = shutil.copyfile(inFile, outFile)

    fileAlter(outFile)



def fileAlter(file):


    lines = file.readlines()
    print (lines)

#applies needed changes
    sep = '/'
    rest = text.split(sep,1)[1]
    line[0] = rest

    sep = '.'
    rest = text.split(sep,1)[0]
    line[0] ='%chk=' rest


##    for line in fileinput.input(outFile, inplace=True):
##        print(line.replace('pm3', 'B3LYP/6-31G(d)'))

我认为通过指定line [n]我将能够控制每行发生的事情,但是当我尝试运行它时我得到AttributeError: 'str' object has no attribute 'readlines'。我不知道为什么我的文件是一个字符串。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

outfile是包含文件名的字符串。正如shutil doc中指定的那样(虽然不是文档字符串)copyfile会返回第二个参数dst

尽管如此,写文件只是为了阅读和重写它是没有意义的。除非您需要后续行的信息来编辑早期行,否则请一次读取,编辑和写入一行。

with open(infile,...) as inn, open(outfile,...) as out:
    for line in inn:  # or: for n, line in enumerate(inn):
        if need_to_edit(line):
            line = edit(line)
        out.write(line)

如果您确实需要以后的信息,请使用inn.readlines()或内存不足,扫描一次以收集信息,快退(寻找开始),再次扫描以进行编辑和写入。