0

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

4

3 回答 3

2

正如您上次问到的那样,与顺序访问一起使用的 recl= 不是标准的,至少对一个编译器没有任何作用,几乎可以肯定应该忽略。

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

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

items 将您的值保存为字符串..然后您根据类型转换每个值:

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 获得的确切输出。如果您需要相同的间距、小数位等,请参阅 Vladimir 注释。(如果 python 中的值为 0.1,则没有一种简单的方法可以像使用 fortran 那样强制打印尾随零 0.100000)

于 2013-03-31T12:21:39.280 回答
1

你的第一个例子显然是错误的括号。应该和第二个一样。

Trim 只清除尾随空格。这里可能不需要。

在您的情况下,文件将连接到顺序访问。在这种情况下,RECL 设置文件的最大记录长度(这意味着行长度)。你很有可能忽略它。

I/O 语句第二个位置的星号表示使用列表导向格式。这使编译器在如何精确格式化输出方面具有一定的自由度。特别是,如果输出太长,或者输入不包含当前行中的所有 te 项,编译器会继续下一行(记录)。

因此,READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz 如果它包含 7 个项目,则可以从 1 行读取,但也可以从 7 行中读取一个项目。如果你想保持这种灵活性,你必须在你的 Python 代码中考虑到这一点。

WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)应该只写入一行,因为它只有两个项目,除非它们是长字符串。

于 2013-03-31T11:02:32.263 回答
-1

从系统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()
于 2013-07-22T07:42:18.700 回答