0

我有一个由在 SL6 上运行的 Fortran 程序创建的文本文件。看起来像:

1

R - Z     binning n.   1  "1         " , generalized particle n.  223      
  R coordinate: from  0.0000E+00 to  1.1000E+02 cm,   110 bins ( 1.0000E+00 cm wide)
  Z coordinate: from -2.9000E+02 to  2.9000E+02 cm,   290 bins ( 2.0000E+00 cm wide)
  axis coordinates: X = 0.0000E+00, Y =  0.0000E+00 cm
  Data follow in a matrix A(ir,iz), format (1(5x,1p,10(1x,e11.4)))

 accurate deposition along the tracks requested
  this is a track-length binning
   3.0406E-01  2.3565E-02  1.0664E-02  7.2081E-03  5.2534E-03  4.8756E-03  4.5011E-03  4.2792E-03  4.1801E-03  3.9648E-03
   3.9108E-03  3.8301E-03  3.7256E-03  3.6330E-03  3.5912E-03  3.5461E-03  3.4579E-03  3.4813E-03  3.4395E-03  3.3868E-03
   And so on for 6000 lines...

我想将所有数字读入列表列表,因此我必须跳过前九行,但尽管打开为“rU”,Python 仍无法识别尾行。就像一个测试,这段代码:

f = open(file, 'rU')
print f.readlines(2)

输出(将 '\n' 作为字符串的一部分读取):

BlBlockq['1\n', ' R - Z 分箱 n. 1“1”,广义粒子n。223\n', ' R 坐标:从 0.0000E+00 到 1.1000E+02 cm,110 个 bin(1.0000E+00 cm 宽)\n', ' Z 坐标:从 -2.9000E+02 到 2.9000E+02 cm, 290 bins ( 2.0000E+00 cm 宽)\n', ' 轴坐标:X = 0.0000E+00, Y = 0.0000E+00 cm\n', ' 数据遵循矩阵 A(ir,iz) , format (1(5x,1p,10(1x,e11.4)))\n', '\n', ' 沿要求的轨道精确沉积\n', '这是轨道长度分箱\n' , ' 3.0406E-01 2.3565E-02 1.0664E-02 7.2081E-03 5.2534E-03 4.8756E-03 4.5011E-03 4.2792E-03 4.1801E-03 3.9648E-03 E-', ' 3.9108 03 3.8301E-03 3.7256E-03 3.6330E-03 3.5912E-03 3.5461E-03 3.4579E-03 3.

非常感谢您对此的任何帮助!

4

3 回答 3

1

这是按预期运行的。从文档

readlines:使用 readline() 读取直到 EOF 并返回一个包含如此读取的行的列表。如果存在可选的 sizehint 参数,而不是读取到 EOF,而是读取总计大约 sizehint 字节的整行(可能在四舍五入到内部缓冲区大小之后)。如果 sizehint 无法实现或无法有效实现,则实现类文件接口的对象可能会选择忽略它。

readline:从文件中读取一整行。结尾的换行符保留在字符串中(但当文件以不完整的行结尾时可能不存在)。

如果你不想要尾随行,strip每行都会去掉它。

如果您只想跳过一些开场白,有很多方法可以做到这一点。我个人偏爱itertools.islice

for line in itertools.islice(infile, 9, None):
    print line
于 2013-07-26T15:51:39.113 回答
0

您可以使用 Python 的with 语句而不是使用 readlines,如下所示:

contents=[]
with open(file_name,'rU') as fin:
    for i,line in enumerate(fin):
        if i>9:
            contents.append(line.rstrip('\n'))

或者,更简洁地说:

with open(file_name,'rU') as fin:
    contents=[line.rstrip('\n') for i,line in enumerate(fin) if i>9]

由于自动关闭和更优雅的错误收集,使用with和打开文件是首选习惯用法。

您可以使用enumerate来跟踪文件中要跳过或保留的行。

于 2013-07-26T17:08:05.840 回答
0

我不确定是否readlines指定将删除换行符,只是将它们用作分隔符。

不过,您可以轻松解决此问题:

lines = [line.strip() for line in file.readlines()]
于 2013-07-26T15:59:53.190 回答