gpt4 book ai didi

python - 使用 python 对文件进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:16 25 4
gpt4 key购买 nike

我有一个未按数字排序的数据文件(轨迹文件)。数据文件由重复的文本和数字组成,如下所示。如您所见,前 4 行只是信息,排序的实数从第五行开始。话又说回来,另外四行只是信息,然后数字从第五行开始。这些重复了数百个街区。我想将它们按数字排序作为第一列。

ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
ITEM: ATOMES id type x y z
4959 8 10.1 20.1 41.1
5029 8 13.1 43.1 5.3
....
ITEM: TIMESTEP
100
ITEM: NUMBER OF ATOMS
ITEM: ATOMES id type x y z
1259 8 10.1 20.1 41.1
6169 8 13.1 43.1 5.3
....
ITEM: TIMESTEP
200
ITEM: NUMBER OF ATOMS
ITEM: ATOMES id type x y z
3523 8 10.1 20.1 41.1
9119 8 13.1 43.1 5.3
....

我尝试制作一个Python脚本。我的想法是将 'ITEM: ATOMES id type x y z' 和 ITEM: NUMBER of ATOMS 之间的每个数字 block 放入列表中,然后在列表中对它们进行排序并打印它们。我已将它们放入列表中,但每个元素(例如,4959 8 10.1 20.1 41.1)只是一个字符串。如何排序为列表中字符串的第一列?

我尝试如下。你能给我一些建议吗?

f_in=open('aa', 'r')

def SORT(List):

print 'ITEM: TIMESTEP'
print 'Num of Trajectory'
print 'ITEM: NUMBER OF ATOMS'
print 'ATOMS'
print 'ITEM: BOX BOUNDS pp pp pp'
print '\n\n'
print 'ITEM: ATOMS id type x y z'

for p in List:
print p

LIST=[]

a = 1

for line in f_in:

sp = line.split()

if(len(sp) != 5):
continue
else:
if(a < 5085):
LIST.append(line)
a = a + 1
elif(a == 5085):
LIST.append(line)
LIST = map(lambda s: s.strip(), LIST)
SORT(LIST)
a = 1

最佳答案

以下脚本将读入您的文件并对每个 block 中的行进行排序:

from itertools import groupby

with open('input.txt') as f_input, open('output.txt', 'w') as f_output:
for k, g in groupby(f_input, lambda x: x != 'ITEM: TIMESTEP\n'):
if k:
entries = [line.strip() for line in g]
block_header = ['ITEM: TIMESTEP'] + entries[:3]
entries = sorted([line.split() for line in entries[3:]], key=lambda x: int(x[0]))
f_output.write('\n'.join(block_header) + '\n')

for row in entries:
f_output.write(' '.join(row) + '\n')

它利用Python的groupby函数根据ITEM: TIMESTEP分块读入文件。然后,它从每行中删除新行,并仅提取具有值的行。然后,它根据空格分割每一行,并通过将第一个条目转换为整数来对这些行进行排序。

然后,它将每一行写入输出文件,并为每个行提供相同的 block 头。

关于python - 使用 python 对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com