我正在将一些代码从fortran90转换为python 2.7,并且无法理解fortran代码中的Open,Write和Read函数中的参数,以及知道在我编写代码时需要添加哪些元素把它写在python中。
以下是我想要理解并转换为python的一些fortran代码块:
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)
我知道重复的READ(1,*)只是读取文件的前7行,但我不确定是否有任何python等效的快捷方式,即从第8行开始的一种方式
答案 0 :(得分:2)
正如上次你提到的那样,recl =用于顺序访问不是标准的,至少对一个编译器没用,几乎肯定应该被忽略。
在python中,你将行读作字符串并处理字符串,如下所示:
file=open(filename,'r')
for i in range(6):file.readline() #skipping 6 lines
items=file.readline().split()
项目将您的值保存为字符串..然后根据类型转换每个:
logTime=float(item[0])
我只是在没有测试的情况下飞过了它。但它应该让你开始。
如果需要,一个问题,带有“*”的fortran将从多行读取。我怀疑这是这种情况,但为了完整,你需要做这样的事情,
items=[]
while len(items)<nrequired:items.extend(file.readline().split())
写作你可以尝试:
file=open(filename,'r')
file.write(' '.join([repr(x) for x in (v1,v2,v3)])+'\n')
或
file.write(('%.14g'+(' %.14g'*2)+'\n')%(v1,v2,v3))
(need to count how many values you have to put the "*2" )
这些都不能为您提供从fortran获得的确切输出。如果你需要相同的间距,小数位等,请参阅Vladimirs评论.. (如果python中的值为0.1,则没有一种简单的方法可以强制打印尾随的零点0.100000,就像你使用fortran一样)
答案 1 :(得分:1)
你的第一个例子显然是错误的括号。它应该像第二个一样。
修剪仅清除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)
应该只写一行,因为它只有两个项目,除非它们是长字符串。
答案 2 :(得分:-1)
来自sys import argv
脚本,
filename = argv
txt = open(filename)
print "Here's your file %r:" % filename
print txt.read()
print "Type the filename again:"
file_again = raw_input("> ")
txt_again = open(file_again)
print txt_again.read()