Skip to main content
 首页 » 编程设计

python之如何使用python在给定位置选择包含数字的行

2025年05月04日18mate10pro

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

 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  

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

请您参考如下方法:

更新

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

过滤器() 是a built in Python function .它有两个参数:一个可迭代对象和一个选择器函数,并创建另一个可迭代对象(列表、元组或字符串)。 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. 将结果列表写入新文件

一些让你开始的代码:

返回决策函数的函数。这将在稍后的过滤功能中使用。它创建一个函数,该函数将参数传递给可索引对象并返回 true 或 false 值。

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