如何在Python2.7中打开、读取和写入文件——将代码从fortran 90转换为Python

2024-06-28 19:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件函数代码closereadopendofile
3条回答

从系统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()

正如您上次提出的问题所指出的,与顺序访问一起使用的recl=不是标准的,它对至少一个编译器没有任何作用,而且几乎肯定应该被忽略。

在python中,将行作为字符串读取并处理字符串,如下所示:

file=open(filename,'r')
for i in range(6):file.readline()   #skipping 6 lines
items=file.readline().split()

项将值保存为字符串。。然后根据类型转换每个类型:

logTime=float(item[0])

我只是在没有测试的情况下飞了起来..但它应该能让你开始。

如果需要,一个gotcha,带“*”的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,没有一种简单的方法可以像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)应该只写一行,因为它只有两个项,除非它们是长字符串。

相关问题 更多 >