簡體   English   中英

使用python2腳本寫入.csv文件時,多個文件中的數據附加了多余的字符(。)。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM