簡體   English   中英

如何在Python 2.7中打開,讀取和寫入文件 - 將代碼從fortran 90轉換為Python

[英]How to Open, Read, and Write files in Python 2.7 — Converting code from fortran 90 to Python

我正在將一些代碼從fortran90轉換為python 2.7,並且無法理解fortran代碼中的Open,Write和Read函數中的參數,以及在編寫代碼時知道添加到代碼中需要哪些元素蟒蛇。

以下是我想要理解並轉換為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行開始的方式。

正如上次你提到的那樣,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獲得的確切輸出。 如果你需要相同的間距,小數位等,請參閱Vladimirs注釋..(如果python中的值為0.1,則沒有一種簡單的方法可以強制打印尾隨的零點0.100000,就像你使用fortran一樣)

你的第一個例子顯然是錯誤的括號。 它應該像第二個一樣。

修剪僅清除尾隨空格 這可能不需要。

在您的情況下,該文件將連接到順序訪問。 在這種情況下,RECL設置文件的最大記錄長度(這意味着行長度)。 很有可能你可以忽略它。

I / O語句第二個位置的星號表示使用列表定向格式 這使編譯器可以自由地格式化輸出。 特別是,如果輸出太長,或者輸入不包含當前輸出中的所有te項,則編譯器繼續在下一行(記錄)上繼續。

因此, READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz可以從1行讀取,如果它包含7個項目,但它也可以從7行中帶有一個項目的紅色。 如果你想保持這種靈活性,你必須在Python代碼中使用它。

WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)應該只寫一行,因為它只有兩個項,除非它們是長字符串。

來自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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM