Python3 Объединить несколько файлов и игнорировать заголовки и записи трейлера - PullRequest
1 голос
/ 31 марта 2020

Я хочу объединить несколько файлов и пропустить записи заголовка и трейлера во всех файлах и иметь имена столбцов (всегда во 2-й строке файла) только один раз в конечном файле при объединении .

Я могу объединить, но как мне пропустить заголовок, трейлер и сохранить имена столбцов только один раз? Каждый файл содержит около 25 миллионов записей.

 File1.txt

    H,ABC,file1.txt
    Name,address,zipcode
    Rick,ABC,123
    Tom,XYZ,456
    T,2  -----------------record count

 File2.txt

    H,ABC,file2.txt
    Name,address,zipcode
    Jerry,ABC,123
    T,1


 File3.txt

    H,ABC,file3.txt
    Name,address,zipcode
    John,ABC,123
    Mike,XYZ,456
    T,2

 ***Final Output:***

    Name,address,zipcode
    Rick,ABC,123
    Tom,XYZ,456
    Jerry,ABC,123
    Harry,XYZ,456
    John,ABC,123
    Mike,XYZ,456

Код:

filenames = ['File1.txt', 'File2.txt', 'file3.txt']
with open('output_file', 'w') as outfile:
    for fname in filenames:
        with open(fname) as infile:
            for line in infile:
                outfile.write(line)

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Использование Python:

Вот действительно простой метод, который использует pandas.read_csv для объединения ваших файлов TXT и вывода в один файл TXT, используя pandas.DataFrame.to_csv.

import pandas as pd
from glob import glob

df = pd.DataFrame()
files = glob('./addr_files/*.txt')

for f in files:
    df = df.append(pd.read_csv(f, skiprows=1, skipfooter=1, engine='python'))

df.to_csv('./addr_files/output.txt', index=False)

Вывод:

(py35) ~/Desktop/so/addr_files
$ cat output.txt
Name,address,zipcode
Rick,ABC,123
Tom,XYZ,456
Jerry,ABC,123
Harry,XYZ,456
John,ABC,123
Mike,XYZ,456

Использование GNU sed:

Вот еще одна опция, которая будет транслировать вывод каждого файла с именем file*.txt в новый файл (all.txt), пропуская строки, которые вы хотите пропустить; в частности, 1-й, 2-й и последний.

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

#!/usr/bin/env bash

# Print the header to the output file.
sed -n 2p file1.txt > all.txt

# Stream (specific) content of all files to output file.
for f in $( ls file*.txt ); do sed '1d;2d;$d' $f >> all.txt; done

Вывод:

(base) user@host ~/Desktop/so/concat                                                                             
$ cat all.txt
Name,address,zipcode
Rick,ABC,123
Tom,XYZ,456
Jerry,ABC,123
Harry,XYZ,456
John,ABC,123
Mike,XYZ,456
0 голосов
/ 01 апреля 2020

1) Вы можете немного изменить то, что вы сделали в следующем:

filenames = ['File1.txt', 'File2.txt', 'file3.txt']
with open('output_file', 'w') as outfile:
    outille.write("Name,address,zipcode\n")
    for fname in filenames:
        with open(fname) as infile:
            for line in infile:
                if line.find("Trailer record") < 0 and line.find("Name,address,zipcode") < 0 :
                    outfile.write(line)

2) В качестве альтернативы, если вы знакомы с командой grep в unix, вы можете использовать ее. Вы можете использовать его непосредственно в Python с библиотекой sh и связывать команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...