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

标签 python list file sorting row

我有一个未按数字排序的数据文件(轨迹文件)。数据文件由重复的文本和数字组成,如下所示。如您所见,前 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/

相关文章:

C# 与 Python : XML Handling/Processing Productivity

c++ - list.begin() 上的段错误

c++ - 读取文件时如何避免atoi

c - 用C写入文件

python - 如何将pyd文件导入到Maya中

python - 如何在Redis中从hmset()切换到hset()?

python - Python中的特定子矩阵提取

python - 列表上环绕运行窗口

python - 过滤给定条件的最小元素

c - Mcrypt 库将结果写入文件