使用python2脚本写入.csv文件时,多个文件附加的额外字符('。')

时间:2017-12-20 10:14:01

标签: python python-2.7

我正在尝试在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完成:E(RB + HF-LYP)= -107.450926197 A.U.经过5个周期

现在我需要为每个.out文件获取E的值(无论使用何种计算方法)并将其附加到具有2列的.csv文件中:一个用于能量,一个用于键长度(乘以10) ^ 3,但现在并不重要),这是.out文件的名称(例如1036.out)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题在于您提取数据的方法 - 从示例行中过滤掉不是数字,短划线或点的字符会导致return $this->output ->set_content_type('application/json') ->set_status_header(200) ->set_output(json_encode($data)); - 第一个破折号来自--107.450926197..5部分,尾随5来自HF-LYP,前面的两个点来自5 cycles。当你切出子串的第一个和最后一个字符时,你将获得A.U.

我建议的是通过在字符串中找到-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