我有一些文件需要在几行上进行更改,而它所在的行确定需要更改的内容。我已经查看了其他答案,但他们似乎假设整个文件中只需要更改一个字符,或者只需要更改一行。
我的文件如下:
%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'
。我不知道为什么我的文件是一个字符串。
感谢任何帮助。
答案 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()
或内存不足,扫描一次以收集信息,快退(寻找开始),再次扫描以进行编辑和写入。