EwanWu2 2022-04-01 11:42 采纳率: 100%
浏览 45
已结题

请教各位,我有一份txt文档,里面包含重复的样本数据,怎么用Python将齐转换为我想要的格式

文本如下
:BEGIN
"SN" "1"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.615 2.61 0.01 0.01 0.005
FAI6 1.998 2 0 0.01 0.002
FAI2 5.997 6.0 0 0.01 0.003
FAI3_2 0.102 0.1 0.02 0.02 0.002
FAI3_1 0.098 0.1 0.02 0.02 0.002
FAI4 3.998 4 0 0.01 0.002
:END
:BEGIN
"SN" "2"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.612 2.61 0.01 0.01 0.005
FAI6 1.996 2 0 0.01 0.004
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.099 0.1 0.02 0.02 0.001
FAI3_1 0.097 0.1 0.02 0.02 0.003
FAI4 3.995 4 0 0.01 0.005
:END
:BEGIN
"SN" "3"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.613 2.61 0.01 0.01 0.005
FAI6 1.999 2 0 0.01 0.001
FAI2 5.996 6.0 0 0.01 0.004
FAI3_2 0.105 0.1 0.02 0.02 0.005
FAI3_1 0.101 0.1 0.02 0.02 0.001
FAI4 3.997 4 0 0.01 0.003
:END
:BEGIN
"SN" "4"
"Machine" "1246"
"Nonumber" "11111"
FAI1 2.611 2.61 0.01 0.01 0.005
FAI6 1.997 2 0 0.01 0.003
FAI2 5.998 6.0 0 0.01 0.002
FAI3_2 0.098 0.1 0.02 0.02 0.002
FAI3_1 0.096 0.1 0.02 0.02 0.004
FAI4 3.999 4 0 0.01 -0.002
:END
想转换的格式是,按SN为列将后面重复的行转换到列上去,如下:
1 2 3 4
FAI1 2.615 2.612 2.613 2.611
FAI6 1.998 1.996 1.999 1.997
FAI2 5.997 5.998 5.996 5.998
FAI3_2 0.102 0.099 0.105 0.098
FAI3_1 0.098 0.097 0.101 0.096
FAI4 3.998 3.995 3.997 3.999
谢谢各位,已知格式是固定的,每一份样本数据是一:BEGIN开头,以:END结束,如果不知道,其中数据的行数该如何排列。

  • 写回答

4条回答 默认 最新

  • CSDN专家-文盲老顾 2022-04-01 15:12
    关注
    
    import re
    
    a = ''':BEGIN
    "SN" "1"
    "Machine" "1246"
    "Nonumber" "11111"
    FAI1 2.615 2.61 0.01 0.01 0.005
    FAI6 1.998 2 0 0.01 0.002
    FAI2 5.997 6.0 0 0.01 0.003
    FAI3_2 0.102 0.1 0.02 0.02 0.002
    FAI3_1 0.098 0.1 0.02 0.02 0.002
    FAI4 3.998 4 0 0.01 0.002
    :END
    :BEGIN
    "SN" "2"
    "Machine" "1246"
    "Nonumber" "11111"
    FAI1 2.612 2.61 0.01 0.01 0.005
    FAI6 1.996 2 0 0.01 0.004
    FAI2 5.998 6.0 0 0.01 0.002
    FAI3_2 0.099 0.1 0.02 0.02 0.001
    FAI3_1 0.097 0.1 0.02 0.02 0.003
    FAI4 3.995 4 0 0.01 0.005
    :END
    :BEGIN
    "SN" "3"
    "Machine" "1246"
    "Nonumber" "11111"
    FAI1 2.613 2.61 0.01 0.01 0.005
    FAI6 1.999 2 0 0.01 0.001
    FAI2 5.996 6.0 0 0.01 0.004
    FAI3_2 0.105 0.1 0.02 0.02 0.005
    FAI3_1 0.101 0.1 0.02 0.02 0.001
    FAI4 3.997 4 0 0.01 0.003
    :END
    :BEGIN
    "SN" "4"
    "Machine" "1246"
    "Nonumber" "11111"
    FAI1 2.611 2.61 0.01 0.01 0.005
    FAI6 1.997 2 0 0.01 0.003
    FAI2 5.998 6.0 0 0.01 0.002
    FAI3_2 0.098 0.1 0.02 0.02 0.002
    FAI3_1 0.096 0.1 0.02 0.02 0.004
    FAI4 3.999 4 0 0.01 -0.002
    :END'''
    
    b = re.findall(':BEGIN[\s\S]*?(?=:BEGIN|$)',a)
    z = {}
    for m in b:
        '''使用正则获取Machine数据'''
        mach = re.search('(?<="Machine" ")(\d+)',m).group()
        '''如果Machine不存在于集合中,增加集合子项'''
        if mach not in z.keys():
            z[mach] = {}
        '''使用正则获取SN数据'''
        sn = re.search('(?<="SN" ")(\d+)',m).group()
        '''使用正则获取各行数据,以数字结尾的行为数据行'''
        n = re.findall('[^\r\n]+\d(?=[\r\n]|$)',m)
        '''对各行数据循环'''
        for r in n:
            '''使用split切分各行各自的数据'''
            fai = r.split(' ')
            if fai[0] not in z[mach].keys():
                z[mach][fai[0]] = {}
            z[mach][fai[0]][sn] = fai[1:]
    
    print(z)
    
    for m in z.keys():
        print(m)
        for fai in z[m]:
            print(''.rjust(8),end='')
            for sn in z[m][fai]:
                print(sn.rjust(8),end='')
            print()
            break
        for fai in z[m]:
            print(fai.rjust(8),end='')
            for sn in z[m][fai]:
                print(z[m][fai][sn][0].rjust(8),end='')
            print()
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 4月1日

悬赏问题

  • ¥15 表达式必须是可修改的左值
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题