[英]Extra characters ('.') appended to data from multiple files while writing to .csv file with python2 script
我正在尝试在python2中创建一个相对简单的脚本,该脚本会通过目录中的多个.out文件进行爬网并提取一些数据。 然后将数据与标识符一起写入.csv文件。
我的问题是看似随机的'。 或“ ..”附加到数据字符串的末尾。
这是我的代码(我知道看这很可怕,对不起):
import os
import string
import time
import sys
import csv
input = raw_input
location = input('Set directory path: ')
os.makedirs(location+'/outputs/')
print "Created output directory."
print "Waiting for archiving to finish..."
forCall = "cd "+location+" && mv *.out outputs/"
os.system(forCall)
time.sleep(1)
print "Archived output files."
newLocation = location+"/outputs/"
def checker(filein, bondlength):
o = open("results.csv", "a")
with open(filein) as curFile:
for line in curFile:
if "SCF Done:" in line:
var = line
var = filter(lambda x: x.isdigit() or x == '-' or x == '.', var)
var = var[1:-2] # slices the first '-' and two trailing '.'
bondlength = ''.join(bondlength.split())
bondlength = bondlength[:-4] # slices .out from 'bondlength.out'
o.write(var+';'+bondlength+'\n')
o.close()
for filename in os.listdir(newLocation):
fileLocation = newLocation+filename
checker(fileLocation, filename)
datacsv = csv.reader(open('results.csv'), delimiter=";")
sortedData = sorted(datacsv, key=lambda row: row[1], reverse=False)
with open('sortedData.csv', 'wb') as csv_file:
wr = csv.writer(csv_file, delimiter=";")
wr.writerows(sortedData)
我感兴趣的.out文件中的行如下所示:
完成SCF:5个周期后E(RB + HF-LYP)= -107.450926197 AU
现在,我需要为每个.out文件获取E(使用任何计算方法)的值,并将其附加到具有两列的.csv文件中:一列用于能量,一列用于键长(乘以10 ^ 3,但这现在并不重要),即.out文件的名称(例如1036.out)。
任何帮助是极大的赞赏。
问题在于您提取数据的方法-从示例行中过滤出不是数字,破折号或点的字符将导致--107.450926197..5
第一个破折号来自HF-LYP
部分, --107.450926197..5
5来自5 cycles
,前两个点来自AU
。 当您将子字符串的第一个和最后一个字符切出时,将得到-107.450926197..
。
相反,我建议是通过在字符串中找到=
来找到数字,然后将所有内容都切掉直到下一个空格,例如:
var = "SCF Done: E(RB+HF-LYP) = -107.450926197 A.U. after 5 cycles"
var = var[var.find("=") + 1:].strip() # clean out everything before the equal sign
var = var[:var.find(" ") + 1].strip() # clean out everything after the first whitespace
# -107.450926197
或者通过在=
然后在空格上分割来更不安全:
var = "SCF Done: E(RB+HF-LYP) = -107.450926197 A.U. after 5 cycles"
var = var.split("=", 1)[1].split(None, 1)[0]
# -107.450926197
或使用简单的正则表达式执行此操作:
import re
find_numbers = re.compile(r"-?[0-9]\d*(\.\d+)?") # find any number
var = "SCF Done: E(RB+HF-LYP) = -107.450926197 A.U. after 5 cycles"
var = find_numbers.search(var).group()
# -107.450926197
您还应该考虑先加载当前结果,然后在遍历*.out
文件时写入相同的列表,对列表进行排序并覆盖results.csv
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.