我有一个具有以下结构的文本:
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)
初步回答
这里有一个粗略的计划:
- 阅读文件
- 将行拆分为列表
- 筛选出符合您条件的行
- 将结果列表写入新文件
一些让你开始的代码:
返回决策函数的函数。这将在稍后的过滤功能中使用。它创建一个函数,该函数将参数传递给可索引对象并返回 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()
