如何在Python 2.7中打开,读取和写入文件 - 将代码从fortran 90转换为Python

时间:2013-03-31 10:41:02

标签: python python-2.7 fortran fortran90

我正在将一些代码从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行开始的一种方式

3 个答案:

答案 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()