Файл слияния, но выводится только в строке заголовка

Я видел некоторые предыдущие сообщения, которые имеют решения, которые работают для других, но по какой-то причине не работал для меня.

Я пытаюсь написать Python скрипт, чтобы: 1) объединить три файла которые имеют тот же формат, 2) удалить повторяющиеся заголовки только, 3) сортирует строки ПО Specimen_IDи 4) добавляет 2 новые пустые строки между каждой уникальной Specimen_ID (т. е. каждые три строки, за исключением первой инстанции должны быть первые 4 строки из-за заголовков).

У меня есть часть сценария, который работает для первых двух и последних шагов:

import glob

read_files = glob.glob("*.txt")

header_saved = False
linecnt=0
with open("merged_data.txt", "wb") as outfile:
    for f in read_files:
        with open(f, "rb") as infile:
            header = next(infile)
            if not header_saved:
                outfile.write(header)
                header_saved = True
            for line in infile:
                outfile.write(line)
                linecnt=linecnt+1
                if (linecnt%3)==0:
                    outfile.write("nn")

Есть предложения по сортировке строк? Кроме того, если данные экспортируются из Excel в txt-файлы с разделителями табуляции, я нахожу, что этот сценарий приведет только к выходу, содержащему содержимое первого файла infile, но не другие. Если я просто копирую и вставляю данные в новый txt-файл и использую их в качестве infiles, у меня нет проблем. Кто-нибудь знает, почему я испытываю эту проблему?

Пример текста входного файла (infile 1):

Specimen_ID Measured_by_initals Measure_date    Sex Beak_length Pronotal_width  Right_fore_femur_length Right_fore_femur_width  Left_fore_femur_length  Left_fore_femur_width   Right_hind_femur_length Right_hind_femur_width  Left_hind_femur_length  Left_hind_femur_width   Right_hind_femur_area   Left_hind_femur_area    Right_hind_tibia_width  Left_hind_tibia_width   Notes
a   1   30-Dec-16   M   4   4   4   4   4   4   4   4   4   4   4   4   4   4   
b   1   30-Dec-16   F   4   4   4   4   4   4   4   4   4   4   4   4   4   4   beak bent
c   1   30-Dec-16   M   4   4   4   4   4   4   4   4   4   4   4   4   4   4   
d   1   30-Dec-16   F   4   4   4   4   4   4   4   4   4   4   4   4   4   4   
e   1   30-Dec-16   F   4   4   4   4   4   4   4   4   4   4   4   4   4   4   pronotum deformed
f   1   30-Dec-16   F   4   4   4   4   4   4   4   4   4   4   4   4   4   4   

Пример текста входного файла (infile 2):

Specimen_ID Measured_by_initals Measure_date    Sex Beak_length Pronotal_width  Right_fore_femur_length Right_fore_femur_width  Left_fore_femur_length  Left_fore_femur_width   Right_hind_femur_length Right_hind_femur_width  Left_hind_femur_length  Left_hind_femur_width   Right_hind_femur_area   Left_hind_femur_area    Right_hind_tibia_width  Left_hind_tibia_width   Notes
a   2   30-Dec-16   M   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 
b   2   30-Dec-16   F   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 
c   2   30-Dec-16   M   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 
d   2   30-Dec-16   F   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 
e   2   30-Dec-16   F   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 
f   2   30-Dec-16   F   4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 4.1 

1 ответ

  1. ваше решение должно работать идеально, если нет каких-то неожиданных данных в файлах. Я только что добавил код для вашего 3-го пункта

    read_files = glob.glob("*.txt")
    
    header_saved = False
    linecnt=0
    with open("merged_data.txt", "wb") as outfile:
        for f in read_files:
            with open(f, "rb") as infile:
                header = next(infile)
                if not header_saved:
                    outfile.write(header)
                    header_saved = True
                for line in infile:
                    outfile.write(line)
                    linecnt=linecnt+1
                    if (linecnt%3)==0:
                        outfile.write("\n\n")
    

    inputfile1.формат txt

    Employee,Account,Currency,Amount,Location
    Test 1,  Basic,USD,3000,Airport
    Test 2,  Net, USD,2000,Airport
    Test 3,  Basic,USD,4000,Town
    Test 4,  Net, USD,3000,Town
    Test 5,  Basic,GBP,5000,Town
    Test 6,  Net, GBP,4000,Town
    

    inputfile2.формат txt

    Employee,Account,Currency,Amount,Location
    Test 8,  Basic,USD,3000,Airport
    Test 9,  Net, USD,2000,Airport
    Test 10,  Basic,USD,4000,Town
    Test 11,  Net, USD,3000,Town
    Test 12,  Basic,GBP,5000,Town
    Test 13,  Net, GBP,4000,Town
    

    выход

    Employee,Account,Currency,Amount,Location
    Test 1,  Basic,USD,3000,Airport
    Test 2,  Net, USD,2000,Airport
    Test 3,  Basic,USD,4000,Town
    
    
    Test 4,  Net, USD,3000,Town
    Test 5,  Basic,GBP,5000,Town
    Test 6,  Net, GBP,4000,Town
    
    Test 8,  Basic,USD,3000,Airport
    Test 9,  Net, USD,2000,Airport
    Test 10,  Basic,USD,4000,Town
    
    
    Test 11,  Net, USD,3000,Town
    Test 12,  Basic,GBP,5000,Town
    Test 13,  Net, GBP,4000,Town