2011-01-25 53 views
1

我是新的python,我需要一點幫助,我的python腳本名爲search_max.py。從輸入文件數據解決最大和最小問題

它打開文件「xyz」格式,然後搜索每個座標的最小值和最大值。問題是,當我對awk腳本做同樣的事情時,我得不到相同的結果!

我不知道數據類型或字符串操作是否存在問題或...任何人都可以幫助我解決這個問題嗎?

Python腳本:

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
inputfile = "peamorphe.xyz" 
outputfile = "result.txt" 
# open the input file 
infile = open(inputfile, "r") 
# read line 1 : number of atoms 
atomsno = infile.readline().rstrip('\n').split(" ") 
# read line 2 : name of the system 
systemname = infile.readline().rstrip('\n') 
# read line 3 : initialisation for min and max 
temp2 = infile.readline().rstrip('\n').split(" ") 
zmin = temp2[3] 
zmax = temp2[3] 
ymax = temp2[2] 
ymin = temp2[2] 
xmax = temp2[1] 
xmin = temp2[1] 
lineno = 3 
print zmax, ymin, xmin 
# read other lines 
for ligne in infile.readlines(): 
    lineno = lineno + 1 
    # extraction and strip of data spaced by " " 
    data = ligne.rstrip('\n\r').split(" ") 
    # Conditions for min and max 
    if data[1] < xmin: 
     xmin = data[1] 
     wclxmin = lineno 
    if data[1] > xmax: 
     xmax = data[1] 
     wclxmax = lineno 
    if data[2] < ymin: 
     ymin = data[2] 
     wclymin = lineno 
    if data[2] > ymax: 
     ymax = data[2] 
     wclymax = lineno 
    if data[3] < zmin: 
     zmin = data[3] 
     wclzmin = lineno 
    if data[3] > zmax: 
     zmax = data[3] 
     wclzmax = lineno 

# Evaluation of centers 
zcenter = float(zmax)-float(zmin) 
ycenter = float(ymax)-float(ymin) 
xcenter = float(xmax)-float(xmin) 

# open the input file 
infile = open(inputfile, "r") 
# read line 1 : number of atoms 
atomsno = infile.readline().rstrip('\n').split(" ") 
# read line 2 : name of the system 
systemname = infile.readline().rstrip('\n') 
# read line 3 : initialisation for min and max 
temp2 = infile.readline().rstrip('\n').split(" ") 
zmin = temp2[3] 
zmax = temp2[3] 
ymax = temp2[2] 
ymin = temp2[2] 
xmax = temp2[1] 
xmin = temp2[1] 
lineno = 3 
print zmax, ymin, xmin 
# read other lines 
for ligne in infile.readlines(): 
    lineno = lineno + 1 
    # extraction and strip of data spaced by " " 
    data = ligne.rstrip('\n\r').split(" ") 
    # Conditions for min and max 
    if data[1] < xmin: 
     xmin = data[1] 
     wclxmin = lineno 
    if data[1] > xmax: 
     xmax = data[1] 
     wclxmax = lineno 
    if data[2] < ymin: 
     ymin = data[2] 
     wclymin = lineno 
    if data[2] > ymax: 
     ymax = data[2] 
     wclymax = lineno 
    if data[3] < zmin: 
     zmin = data[3] 
     wclzmin = lineno 
    if data[3] > zmax: 
     zmax = data[3] 
     wclzmax = lineno 

# Evaluation of centers 
zcenter = float(zmax)-float(zmin) 
ycenter = float(ymax)-float(ymin) 
xcenter = float(xmax)-float(xmin) 

awk腳本:

#!/usr/bin/awk -f 
# from a xyz file 
BEGIN{ 
xmax;xmin; 
zmax;zmin; 
ymax;ymin; 
xcent;ycent;zcent; 
xcent = (xmax-xmin)/2; 
ycent = (ymax-ymin)/2; 
zcent = (zmax-zmin)/2; 
print "At the start of the script"; 
print "xmax = " xmax "; " "xmin = " xmin "; xcent = " xcent; 
print "ymax = " ymax "; " "ymin = " ymin "; ycent = " ycent; 
print "zmax = " zmax "; " "zmin = " zmin "; zcent = " zcent; 
print ""; 
} 

{ 
if (xmax<$2) xmax = $2 
if (xmin>$2) xmin = $2 
if (ymax<$3) ymax = $3 
if (ymin>$3) ymin = $3 
if (zmax<$4) zmax = $4 
if (zmin>$4) zmin = $4 
} 

END{ 
xcent = (xmax-xmin)/2; 
ycent = (ymax-ymin)/2; 
zcent = (zmax-zmin)/2; 
print "At the end of the script"; 
print "xmax = " xmax "; " "xmin = " xmin "; xcent = " xcent; 
print "ymax = " ymax "; " "ymin = " ymin "; ycent = " ycent; 
print "zmax = " zmax "; " "zmin = " zmin "; zcent = " zcent} 

,你可以在這裏下載我的輸入文件(14天):peamorphe.xyz

謝謝你在前進, Exilien。

+3

在Python中,您正在比較`data [...]`,它是一個字符串,而不是數字。你必須先'浮動()',否則`999> 1000`。 – eumiro 2011-01-25 18:54:18

回答

5

您的代碼無法按預期工作的原因是由eumiro在上述評論中給出的。

雖然在Python中有一個更簡單的方法:使用NumPy。爲最大值和文件中的每一列的最小值示例代碼將是

import numpy 
a = numpy.loadtxt("peamorphe.xyz", skiprows=2, usecols=(1, 2, 3)) 
max_xyz = a.max(axis=0) 
min_xyz = a.min(axis=0) 
center = max_xyz - min_xyz 

這幾行代碼所做的一切你的腳本執行,其中包括解析輸入文件。如果您還需要最大值和最小值的索引,則可以使用a.argmax()a.argmin()

看起來比較容易,你不覺得嗎?

+0

是啊真的:)。非常感謝。我不知道Numpsy:p。謝謝eumiro的精確度。 – Exilien 2011-01-26 18:01:39