Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python 2.7中打开、读取和写入文件——将代码从fortran 90转换为Python_Python_Python 2.7_Fortran_Fortran90 - Fatal编程技术网

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

如何在Python 2.7中打开、读取和写入文件——将代码从fortran 90转换为Python,python,python-2.7,fortran,fortran90,Python,Python 2.7,Fortran,Fortran90,我正在将一些代码从fortran 90转换为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”只是

我正在将一些代码从fortran 90转换为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”只是给文件名分配了一个标签,修剪是删除变量前后的任何空白,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行开始的方式或其他方式。

您的第一个示例明显错误地插入了括号。应该像第二个一样

“修剪”仅清除“修剪”。这里可能不需要它

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

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

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


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

正如上次您问这个问题时所指出的那样,与顺序访问一起使用的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())

这两种方法都不能提供从fortran获得的精确输出。如果需要相同的间距、小数位数等,请参见Vladimirs注释。。
(如果python中的值为0.1,则没有一种简单的方法可以像fortran那样强制打印尾随的0.100000)

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

谢谢,修复了括号。文件包含7项,所以我猜它只是读取了一行。我不完全清楚你说的星号给编译器一些自由是什么意思。这些函数的python等价物是什么?谢谢它们不是函数,而是语句。自由意味着处理器可以根据需要在输出中插入空格和换行符。阅读时也可以转到下一行。就像我写的一样。检查这个线程和这个包。您可以从未显示的文件中猜出正确的python读取例程。我们也不知道,也不知道您是否真的需要保持灵活性。这非常有帮助。谢谢,我忘记了以前回答过RECL,是的,我将忽略它。WRITE语句是覆盖文件还是追加文件?这将决定我希望python中的参数“w”还是“a”是吗?fortran和python都默认为覆盖。过一会儿我会在我的答案中添加一个写作示例..注意在上次编辑中我修复了两个错误。。split应该没有参数和items=[],而不是items=[,]…输入/输出语句(它们是语句,不是函数)的控制信息列表选项在标准、书籍、在线教程等中有很好的文档记录。。与其猜测它们的含义,不如花更多的时间来看看其中一个。
file.write(('%.14g'+(' %.14g'*2)+'\n')%(v1,v2,v3)) 
                            (need to count how many values you have to put the "*2" )
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()