1

我有一个具有以下结构的文本:

 LINE LINK DEFINITION NUMBER      337 ID =  44015945


 SPW. NB.     SPW. ID.      LENGTH     ELEM.   MAT-ID         X         Y         Z      NODES

      673       673.00    .357E+01 44013671   4400341  0.323E+03-0.448E+03 0.485E+03   44020544 
                                   44002527   4400331  0.326E+03-0.450E+03 0.484E+03   44020545 
     1502       673.01    .558E+01 44013671   4400341  0.323E+03-0.451E+03 0.485E+03   44022202 
                                   44002527   4400331  0.329E+03-0.450E+03 0.484E+03   44022203 
      674       674.00    .355E+01 44013671   4400341  0.323E+03-0.448E+03 0.480E+03   44020546 
                                   44002516   4400331  0.325E+03-0.450E+03 0.479E+03   44020547 
     1503       674.01    .561E+01 44013671   4400341  0.323E+03-0.451E+03 0.480E+03   44022204 
                                   44002516   4400331  0.328E+03-0.450E+03 0.479E+03   44022205 

现在我想在一个新文件中只写入那些行,其中包含行上给定位置的数字 - 例如以下行:

      676       676.00    .355E+01 44007503   4400341  0.322E+03-0.448E+03 0.475E+03   44020550 
                                   44002516   4400331  0.325E+03-0.450E+03 0.474E+03   44020551 

任何想法将不胜感激。谢谢

4

1 回答 1

6

更新

Drago你可能想使用 Python 的 filter() 函数。它高效而优雅。该函数将结果存储在内存中。因为您的解决方案将整个文件存储在内存中,所以我认为这是可以接受的。

filter() 是一个内置的 Python 函数。它有两个参数:一个可迭代对象和一个选择器函数,并创建另一个可迭代对象(列表、元组或字符串)。filter() 将选择器应用于输入序列的每个元素。返回的序列包含输入序列中选择器评估为真的元素。大致相当于

for object in sequence:
   if selector(object):
      result.append(object)

文件是一个可迭代的对象,因此它可以被过滤。作为选择器,您可以简单地使用类似 is_number 函数的东西,其中字符串索引是硬编码的,但我通过定义一个将索引作为参数并返回选择器的函数使其更加灵活。请注意,选择器接受单个参数。

这是一个解决方案

def is_number(s):
    """ From your solution. """
    try:
        float(s)
        return True
    except ValueError:
        return False

def func(i1, i2):
    return lambda str: is_number(str[i1:i2].strip())

if __name__ == '__main__':
    result = []
    with open('in.txt') as fin:
       result = filter(func(0,10), fin)
    with open('out.txt', 'w') as fout:
        for s in result:
            fout.write(s)

初步答案

这是一个粗略的计划:

  1. 读取文件
  2. 将行拆分为列表
  3. 过滤掉符合您条件的行
  4. 将结果列表写入新文件

一些可以帮助您入门的代码:

返回决策函数的函数。这将在稍后的过滤器函数中使用。它创建一个函数,该函数接受一个可索引对象的参数并返回真或假值。

def func(idx, number):
  return lambda arg: arg[idx] == number

打开文件并阅读它,将每一行分开。这需要更多的工作。您需要注意文件格式。例如,正确读取数字,忽略非数据行。

input = open('file name', 'r')
listoflists = []
for line in input:
  list = line.split(' ') # an example of splitting with space separator
  listoflists.append(list)

使用内置 Python 函数过滤数据

idx = 1
number = 10
result = filter(func(idx, number), listoflists)

写入输出文件。您可能希望根据需要对其进行格式化。

out = open('file name', 'w')
for l in result:
  out.write(l)

关闭你的文件...

input.close()
out.close()
于 2013-09-03T12:22:57.520 回答