我正在将一些代码从fortran90转换为Python2.7,并且在理解fortran代码中的in Open、Write和Read函数的参数以及在用python编写代码时需要向代码添加哪些元素方面遇到困难。
下面是一些fortran代码块,我想了解它们并将其转换为python:
OPEN(1,FILE=TRIM(filenameOut),RECL=2000)
WRITE(1,*) "tAge/yr (u-r) (u-z) fGas Mstars/MstarsOld"
CLOSE(1)
我猜“1”只是给文件名分配了一个标签,TRIM是在python等价的变量filenameOut.strip()或其他东西之前或之后删除任何空格。我不确定RECL在做什么,以及其他函数的python等价物在这个块中是什么。
另一个例子:
OPEN(1,FILE=TRIM(filenameOut),RECL=2000)
WRITE(1,*) "(u-r) prob(u-r)"
DO countInside=1,nColourBins
WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)
CLOSE(1)
从这里我可以猜到星号意味着写入文件的下一行。再说一次,我还不知道如何在python中实现这一点。
阅读fortran代码的示例:
OPEN(1,FILE=TRIM(filenameBC),RECL=2000)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
IOEnd=0
DO WHILE(IOEnd>-1)
READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz
END DO
CLOSE(1)
我知道重复读取(1,*)只是读取文件的前7行,但我不确定是否有任何与python等效的快捷方式,即从第8行开始的方式或其他方式。
从系统
import argv
剧本
正如您上次提出的问题所指出的,与顺序访问一起使用的recl=不是标准的,它对至少一个编译器没有任何作用,而且几乎肯定应该被忽略。
在python中,将行作为字符串读取并处理字符串,如下所示:
项将值保存为字符串。。然后根据类型转换每个类型:
我只是在没有测试的情况下飞了起来..但它应该能让你开始。
如果需要,一个gotcha,带“*”的fortran将从多行读取。我怀疑这里的情况,但为了完整起见,你需要做这样的事情
写作可以尝试:
或者
这两种方法都不能提供从fortran获得的确切输出。如果您需要相同的间距、小数位数等,请参阅Vladimirs注释。。 (如果python中的一个值是0.1,没有一种简单的方法可以像fortran那样强制打印0.100000的尾随零)
你的第一个例子显然被错误地插入了括号。它应该和第二个一样。
Trim只清除trailing spaces。这里可能不需要。
在您的情况下,文件将连接到顺序访问。在这种情况下,RECL设置文件的最大记录长度(这意味着行长度)。你很有可能忽略它。
I/O语句第二个位置的星号表示list-directed format的用法。这使编译器在输出的格式方面有了一些自由。特别是,如果输出太长,或者输入不包含当前输入中的所有te项,编译器将继续下一行(记录)。
所以,
READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz
可以从1行读取,如果它包含7个项目,但也可以从7行读取一个项目。如果要保持这种灵活性,必须在Python代码中考虑到这一点。WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)
应该只写一行,因为它只有两个项,除非它们是长字符串。相关问题 更多 >
编程相关推荐