<p>在fortran中,<code>open(1,FILE=TRIM(filenameBC),RECL=2000)</code>打开名为<code>filenameBC</code>的文件。<code>TRIM</code>部分是不必要的,因为fortran运行库将为您完成这项工作(它的python等价物是<code>filenameBC.rstrip()</code>)。这里的<code>RECL=2000</code>部分也有点可疑。我不认为它在这里有任何作用,我认为使用它是未定义的行为,因为您的文件应该被连接以进行<code>"sequential"</code>访问。根据第12.10.1节</p>
<blockquote>
<p>RECL = rl</p>
<p>rl is an integer expression whose value must be positive. It specifies the length of each record in a file being connected for direct access. If the file is being connected for formatted input/output, the length is the number of characters. If the file is being connected for unformatted input/output, the length is measured in processor-dependent units. For an existing file, the value of rl must be included in the set of allowed record lengths for the file ( 12.2.2). For a new file, the processor creates the file with a set of allowed record lengths that includes the specified value. <strong>This specifier must be given when a file is being connected for direct access; otherwise, it must be omitted.</strong> </p>
</blockquote>
<p>如果是这样的话,我认为它规定了<em>最大</em>线长度。在</p>
<p>Fortran的句柄就是文件的整数。所以,在python中,你会说:</p>
<pre><code>filehandle = open('file')
line = filehandle.readline() #or better, `next(filehandle)` :)
</code></pre>
<p>在fortran中,这与:</p>
^{pr2}$
<p><code>*</code>基本上可以让您从文件中读取一行。在</p>
<hr/>
<p>请注意,这个fortran代码有一点缺陷,效率非常低。例如,检查<code>IF (IOEnd>-1) THEN</code>在任何不是文件结尾的情况下都会成功(例如,奇怪的错误将被屏蔽,类似于python中的一个空的<code>except</code>)。在python中,您只需将这些信息打包到一个列表中并动态地增长列表python将处理您需要执行的所有重新分配。最后,您可以选择将列表转换为numpy<code>ndarray</code>。在</p>
<p>在伪python代码中,这大致相当于:</p>
<pre><code>data_list = []
with open(filenameBC.rstrip()) as fin:
for _ in range(29): #throw away first 29 lines (I think I counted right ...)
next(fin)
for line in fin:
data_list.append([float(x) for x in line.strip()])
timeArray,MbolArray,uArray,gArray,rArray,iArray,zArray = zip(*data_list)
</code></pre>