JingheSu 发表于 2011-6-9 21:12:15

加分帖:python学习初级篇

本帖最后由 JingheSu 于 2011-6-15 09:05 编辑

自从被池总诱惑入门以后,python已经成为我的工作语言了。本人是个注重实用的人,虽然也想能系统地学习python,可是一是没有那么多的时间;二是也下不了那么大的恒心,所以我的python也就仅仅限于简单的工作应用罢了,如果处理数据,abaqus前后处理等等。下面就从入门的角度利用工作中常用的几个小程序再现一下的我python历程,希望可以帮助那些想在短期内学会使用python的人们.
首先推荐一下python环境:
当然你不装python也可以,因为abaqus610内置了python2.6(abaqus69内置的是python2.4,目录一般是C:\SIMULIA\Abaqus\6.X-1\Python),但是我还是推荐另外单独安装一个python,方便利用Editplus调试程序。推荐Editplus做编辑器(功能和Ultraedit不相上下打开70M的文本文件也就是2s不到的延迟),具体配置可以看看这个文章,可以实现语法高亮以及简单的自动补全功能,关键是界面比较清秀!

http://www.cnblogs.com/dkblog/archive/2011/04/02/2003714.html


秀一张我的python in editplus


更新一下楼下几位pythoner提到的常用的几个程序包:
xlwt/xlrd:excel 读写操作
pyExcelerator:excel 读写操作
sciDavis:开源绘图软件,类似于origin,但是可以用python脚本的。
scipy和numpy:科学计算包,类似matlab
matplotlib:python绘图包

kalvens 发表于 2011-8-11 09:12:32

回复 28# JingheSu
jing大~ 都是眼泪啊~:'(,我之前不是不知道嘛
算东西一直都是用批处理来提交,结果一直拿我8核的机器当单核的来用
后来知道了肠子都悔青了~之前要算好几天的东西现在不到一天就结束了

kalvens 发表于 2011-6-10 18:10:21

呵~这么好的帖子刚看见,出去开个会 回来黄花菜都凉了
我也来一个吧,这个是用来转化string的
在abaqus中给梁单元赋属性的时候,必须先把梁单元转换成string
再把set转换成string的set才能附上属性,转成string的set局限就比较多
比如如果要合并模型,压缩了以后只会留下模型和set,string就没有了
写个小PY可以把string的set重新更换成edge的set

from part import *
mypart=mdb.models['Model-1'].parts['Part-1']
mylist=mypart.sets.keys()
for myS in mylist:
   try:
      mypart.Set(edges=mypart.stringers.edges,name=myS)
   except:
      print 'Wrong-Set.. please check!!! :' + myS

JingheSu 发表于 2011-6-9 21:12:54

本帖最后由 JingheSu 于 2011-6-9 21:53 编辑

Python基础


温馨提示:Python是靠每行的文本缩进来标示程序执行流程的,如果你发现你的程序算出来的结果和你预先的不同那么还是用python自带的IDLE打开你的程序,看看是不是有缩进不对的问题。


from math import *
print pi
import math
print math.pi
Import 其实就是告诉计算机:我下面要用来自math这个包里面的东西了。两种import方法都可以,不过得注意调用包里面函数或者对象时候的区别(如pi和math.pi)。

a=11
c=2
b=2.0
d='char'
ab=a+b
ac=a+c
a_b=a/b
a_c=a/c
dd=d+d
f=
print d
print a
print f
print dd
print 'a and b is '+str(ab)
print 'a and c is '+str(ac)
print 'a divided by b is '+str(a_b)
print 'a divided by c is '+str(a_c)
数据基本上可以分为整数(a, c),浮点数(b),列表(f),字符串(d, 实际上也是种列表),其他高级货如字典等等用的时候再看书。

+操作符除了数学里面的加法外,还可以将两个字符串连接成一个字符串,注意一下数值类型是不能和字符串类型直接“相加”,但是可以通过str函数将数字转化为一个字符串再加。
alist=range(4)
flen=len(alist)
print alist
print flen
alist=range(4)从零开始生成一个具有指定个正整数的列表
flen=len(f)返回指定列表f的元素数目


for i in range(len(alist)):
    print alist
i=0
while i<len(alist):
    print alist
    i=i+1
if i<10:
    print i
    i=i+2
这是常用的循环和判断语句

最后再贴一个自己刚开始用python时做的很简单的很简单的插值函数
功能:给出四个列表x,y1,y2,y3(x已经排好顺序了)和一个数值z,程序会根据z在x里面的位置,返回相应的y1,y2,y3列表中对应的插值。
运行方式:interp放在你的python安装目录下,就可以用import命令在你的程序中使用了。
def interp(x,y1,y2,y3,z):
    n=len(x)
    n1=len(y1)
    n2=len(y2)
    n3=len(y3)
    if (n!=n1)&(n!=n2)&(n!=n3):
      print 'Incorrect input parameters: list not matched with eachother'
      return None
    else:
      temp=0
      for i in range(n-1):
            if (z>=x)&(z<=x):
                temp=i
                k=(z-x)/(x-x)
                break
      y1p=y1+(y1-y1)*k
      y2p=y2+(y2-y2)*k
      y3p=y3+(y3-y3)*k
    return y1p,y2p,y3p
if __name__ == '__main__':
    x=(1,2)
    y=(3,4)
    print "interp between x(1,2)y(3,4) at 2 is", interp(x,y,y,y,2)

JingheSu 发表于 2011-6-9 21:13:23

本帖最后由 JingheSu 于 2011-6-9 21:32 编辑

文件读取和修改:INP中cae不支持的关键字的处理


Abaqus中有许多关键字都不支持CAE操作比如我这几天一直在弄得map solution 和import,所以如果想自动完成前处理并提交就必须先建模输出原始INP在修改原是INP得到完整的INP,这里的程序就是用来给原有的INP添加关键字Map solution的。
基本的思想就是读入原始INP查找是不是到了该加的地方了,如果是就加入Map solution数据行,over。

from sys import *
from math import *
from re import *
inpName='Tensile'
inpName1=inpName+'.inp'
f1=open(inpName1,'r')
newName='Map_'+inpName1
f2=open(newName,'w')
s1=f1.readlines()
for s in s1:
f2.write(s)
ss=s.split()
if len(ss)>=2:
if (ss=='*End')&(ss=='Assembly'):
   translate_Y=12.0
   translate_vector='0.0,'+str(translate_Y)+',0.0'+'\n'
   f2.write('*Map solution\n')
   f2.write(translate_vector)
f1.close()
f2.close()
#os.remove(inpName1)


注意:最后如果os.remove(inpName1)不注释那么原来的INP就会被删掉。


文件读取和修改:INP中节点信息的修改
利用上面相同的思路可以给单轴拉伸试件上做一个预凹痕。

from sys import *
from math import *
from re import *
inpName='Tensile'
inpName1=inpName+'.inp'
f1=open(inpName1,'r')
newName='Nock_'+inpName1
f2=open(newName,'w')
s1=f1.readlines()
meshSize=0.0015
for s in s1:
cord_s=s
cord_modify=sub(',',' ',cord_s)
cord_modify=split(' +',cord_modify)
if len(cord_modify)==4:
nodeLable=cord_modify
if nodeLable=='1373':
   cord_mod_x=float(cord_modify)-0.4*meshSize
   f2.write('   1373,'+str(cord_mod_x)+','+cord_modify)
elif nodeLable=='1374':
   cord_mod_x=float(cord_modify)-0.8*meshSize
   f2.write('   1374,'+str(cord_mod_x)+','+cord_modify)
elif nodeLable=='1375':
   cord_mod_x=float(cord_modify)-1.2*meshSize
   f2.write('   1375,'+str(cord_mod_x)+','+cord_modify)
elif nodeLable=='1376':
   cord_mod_x=float(cord_modify)-1.6*meshSize
   f2.write('   1376,'+str(cord_mod_x)+','+cord_modify)
elif nodeLable=='1377':
   cord_mod_x=float(cord_modify)-2.0*meshSize
   f2.write('   1377,'+str(cord_mod_x)+','+cord_modify)
else:
   f2.write(s)
else:
   f2.write(s)
f1.close()
f2.close()
#os.remove(new1_testINP)

其中1376等等就是你要修改的节点编号
效果如下:



JingheSu 发表于 2011-6-9 21:13:34

本帖最后由 JingheSu 于 2011-6-9 21:50 编辑

Python与Excel
目前处理数据离不开excel,所以pythoner必须学会用python操作excel表格。Python与excel交互方法也比较多,我一开始就接触的xlrd/xlwt包。直到现在也没有发现什么bug或者缺点,而且上次从ujs505那里知道Win32Com的方法在64bit系统下无效了,但是xlrd/xlwt方法依然好用,我欣喜万分。具体的用法我有一个帖子里面有说明:
http://forum.simwe.com/thread-978057-1-1.html
这里给出我一个从材料单轴拉伸数据TRA文件中处理得到拉伸过程中各种应力应变量并记录到excel中的例子,其实这个例子比较乱,但是实在没有时间给弄个明了的版本了。大家将就看看。。:)
重点看看其中
1 读取一行文本后如何分割出自己想要的数据(就是re包里面几个函数的应用)

myfile='tensile-'+str(i+1)
f=open(myfile+'.TRA','r')
while state:
s=f.readline()
s=re.sub(';',' ',s)
s=re.split(' +',s)
#print s
#print s0
if (s=="EOF")|(s==s0):
   state=False
else:
   force=float(s)
   eee=float(s)/100.0
   sss=force/area
   test_force.append(force)
   engineer_strain.append(eee)
   engineer_stress.append(sss)
   true_strain.append(log(1.0+eee))
   true_stress.append(sss*(1.0+eee))
   plastic_strain.append(log(1.0+eee)-sss*(1.0+eee)/E_modulus)
f.close()


2 python怎么读写excel那几行就行了。




from xlwt import Workbook
book=Workbook()
sheet=book.add_sheet('test_NT',cell_overwrite_ok=True)
sheet.write(0,nclown,'sample')
sheet.write(0,nclown+2,name)
sheet.write(1,nclown,"area")
sheet.write(1,nclown+2,area)
sheet.write(1,nclown+1,diameter)
sheet.write(1,nclown+3,"E_modulus")
sheet.write(1,nclown+4,E_modulus)
sheet.write(2,nclown,"E_strain")
sheet.write(2,nclown+1,"E_stress")
sheet.write(2,nclown+2,"T_strain")
sheet.write(2,nclown+3,"T_stress")
sheet.write(2,nclown+4,"PL_strain")




import xlrd
bk=xlrd.open_workbook('Static report.xls')
sh=bk.sheet_by_name("Stat")
E_modulus=sh.cell_value(i+2,7)

JingheSu 发表于 2011-6-9 21:13:49

本帖最后由 JingheSu 于 2011-6-10 13:32 编辑

Python后处理解析

鉴于这一部分的重要性,把它单独列出来了
http://forum.simwe.com/thread-988907-1-1.html

JingheSu 发表于 2011-6-9 21:14:14

本来这个里面应该在弄上一个前处理的部分就算是完整了,但是前处理部分我真是心有余而力不足,虽然自己也用但是就是不知道怎么讲出来。大家还是好好看cdstudio斑竹精品:Python二次开发程序详解
http://forum.simwe.com/viewthrea ... mp;highlight=python


最后了在给出一个比较综合的例子,用python来做简单的优化:详见http://forum.simwe.com/thread-980162-1-1.html

这是集前处理(建模并提交计算)后处理(提取odb数据)文件读写等于一身的例子。取这个例子只是想说明abaqus中python是个很好的工具可以利用它完成许多个性化的问题,只要你有想法就试着用python+abaqus来解决,这样才能学好python学好aba,而且乐在其中。

北鹰南飞 发表于 2011-6-9 21:50:04

本帖最后由 北鹰南飞 于 2011-6-9 21:51 编辑

6# JingheSu
SU总攻城略地连下六城啊:lol ,这楼在下先帮你占着,恭候佳作~~~
------------------------------------------------------------------------------------------------------------

JingheSu 发表于 2011-6-9 21:51:54

本帖最后由 JingheSu 于 2011-6-9 22:34 编辑

我们得定期交作业的。。。
————————————————————————————————————
此楼下各种有意义的回复和讨论都会加分

如果能贡献自己平时积攒的有用的代码或心得,技术分伺候!

nbiao 发表于 2011-6-10 10:51:59

顶..呵呵,这个帖子仔细拜读一下

nbiao 发表于 2011-6-10 11:09:35

本帖最后由 nbiao 于 2011-6-10 11:11 编辑

python现在也是我平常辅助数据处理的主要工具。接触python完全是因为abaqus,后来慢慢发现python的强大和便捷。以前一直是用matlab做数据处理,但有了免费的python之后,就很少打开matlab了,何况python在文本处理方面的功能比matlab强大很多。

这里是最近写的一个python脚本。功能就是对一个简单的热传导的模型提取每个step中每个frame中的节点的温度信息,做一些计算,算出来平均温度然后输出到一个csv文件中。后面可以用excel打开。
和版主不同,我把结果文件保存成csv,这样excel也可以打开,而且语法也很方便。csv就是一个文本格式的文件,大量数据的时候,应该速度比操作excel会快一些吧。
画图的话最近在尝试一个叫sciDavis的开源软件,和origin很像,支持python做脚本,好像还不错.import csv
from odbAccess import *
from abaqusConstants import *

filename=getInput('Please input the ODB file name')
#下面这样都是我定义的字典或list,用来存保存提取数据的
elementArea={}
elementConn={}
nodeArea   ={}
timeTP   =[]
#下面可以看做一般的从odb文件中提取结果的步骤
#打开指定的odb文件
odb=openOdb(path=filename)
#得到assembly中所有的instance
inst=odb.rootAssembly.instances
#或取第一个instance中的所有单元,因为我这个odb里面只有一个instance
#.keys()方法可以获得一个list有所有的instance名字
elments=inst].elements
#下面一段对单元循环,得到每个单元的几个结点,然后记录下来
for el in elments:
    label=el.label
    nodes=el.connectivity
    elementConn=nodes

#节点
nodes=inst].nodes
for nd in nodes:
    label=nd.label
    nodeArea=0

#打开指定的step
st=odb.steps]
#对指定step的某个特定场变量做循环
for v in st.frames[-1].fieldOutputs['EVOL'].values:
    label=v.elementLabel
    data =v.data
    elementArea=data

for k,v in elementArea.iteritems():
    nds=elementConn
    for nd in nds:
      nodeArea+=0.25*v

    #下面是提取每个frame中每个节点的NT11值
frames=st.frames   
for fr in frames:
    nt11=fr.fieldOutputs['NT11'].values
    time=fr.frameValue
    sumTp=0
    sumAr=0
    for va in nt11:
      label=va.nodeLabel
      data=va.data
      if data<0:
            area=nodeArea
            sumTp+=data*area
            sumAr+=area
    try:
      mean=float(sumTp)/float(sumAr)
      timeTP.append( (time,mean))
    except:
      print fr.frameId
filename=getInput('pleae input the csv file \n name to save')
wr=csv.writer(file(filename ,'wb'))
#这个把结果写进csv文件,只要一句,很简单,也可以在这一句之前写个表头
wr.writerows(timeTP)

python还是挺有意思的,我在我博客上有一个批量翻译英文单词的脚本。就是自己平常看文献攒下的一些单词调用google批量翻译一下.

北鹰南飞 发表于 2011-6-10 11:42:59

1# JingheSu
因为从未用过python,请问如果我想开发一个新的算法(类似于buckle的改进型),该怎么用python在ABA中实现呢,这会不会是个较大的系统工程?

JingheSu 发表于 2011-6-10 12:13:26

10# nbiao

sciDavis,开源软件!赞美,回去试试。

的确,存为csv会更快一点,不过为了省去再多进行一步数据倒入操作,所以我基本上都直接写入excel的,如果数据量很大的话可能就必须csv了

JingheSu 发表于 2011-6-10 12:20:06

11# 北鹰南飞
buckle的改进型?你说的是计算程序么?

敦诚 发表于 2011-6-10 12:32:36

佩服Jinghe Su兄,这么好的东西也拿来分享。以前我用python来修改inp做参数敏感性分析,可是写好了程序以后就舍不得放在论坛上,惭愧ing。
既然大家都提到了真么多python的包比如xlrd,我就再提两个,而这两个与abaqus联合基本可是实现matlab的一些优化和参数辨识的功能。
scipy和numpy。

北鹰南飞 发表于 2011-6-10 12:34:57

13# JingheSu
是啊,这个能实现么?

JingheSu 发表于 2011-6-10 12:45:18

汗,敦总给我们分享还少么。。
scipy和numpy这两个包是不是很大?我下了一个怎么200M+

JFish 发表于 2011-6-10 14:37:18

scipy和numpy好像没这么大,版主下的是Python(x,y)吧?这个大了一点,貌似500多M,包含了比较全的python工具箱

JingheSu 发表于 2011-6-10 14:43:51

15# 北鹰南飞
python也就只是做做前后处理,具体的计算,得用fortran吧,子程序不知道可不可以实现?

fimltl 发表于 2011-6-10 15:15:24

JingheSu都优秀斑竹了啊?牛撒。
顺便再问一下,那个池总是谁?哈哈

JingheSu 发表于 2011-6-10 15:29:44

楼上这位撒,真骚情呀
页: [1] 2 3 4 5
查看完整版本: 加分帖:python学习初级篇