Объединение текстовых файлов с похожими значениями в один файл с использованием python - PullRequest
0 голосов
/ 17 июня 2020

Я искал на сайте, но не могу найти ничего похожего на то, что я пытаюсь выполнить sh. У меня есть 2 текстовых файла, которые я хочу объединить в 1 файл на основе первой строки в каждом файле (давайте назовем эту строку x). Например, если x существует в файлах file1 и file2, я хочу взять x и отобразить информацию о продолжении из файлов file1 и file2 в его строке. Обратите внимание, файл file1 содержит заголовок. Ниже приведен предварительный просмотр того, как читается каждый файл:

Файл 1:

X, DES1, DES2, DES3, NUMBERS
123, text, text, text, 456
321, text, text, text, 43222
124, text, text, text, 3254
125, text, text, text, 2352634
279, text, text, text, 3243
567, text, text, text, 00001
345, text, text, text, 02

Файл 2:

123, 152352364
124, 32535
125, 745734
345, 4000 

И так далее. Каждый элемент (или x) в файле2 существует в файле1. Однако file1 содержит другие значения для x, которых нет в file2. Могу ли я объединить данные из двух файлов в новый файл? Ниже показано, что я пробовал, но в моем операторе печати появляется ошибка KeyError. Я уверен, что код очень неправильный, FYI.

f1 = {}
with open ("file1.txt") as my1:
    for line in my1.readlines():
        f1[line.split(",")[0]] = line.strip().split(",")[1:]

f2={}
with open ("file2.txt") as my2:
    for line in f.readlines():
        f2[line.split(",")[0]] = line.strip().split(",")[1:]

for key in f1.keys():
    print(key, str.join(",",f1[key]), str.join(",",f2[key]))

Любая помощь будет оценена. Я понимаю, что мне, вероятно, придется серьезно переделать или выбросить то, что у меня есть. Мой ожидаемый результат будет выглядеть следующим образом:

X, DES1, DES2, DES3, NUMBERS, NEWNUMB        
123, text, text, text, 456, 152352364    
321, text, text, text, 43222, 0    
124, text, text, text, 3254, 32535    
125, text, text, text, 2352634, 745743    
279, text, text, text, 3243, 0    
567, text, text, text, 00001, 0    
345, text, text, text, 02, 4000    

1 Ответ

1 голос
/ 17 июня 2020

Вы не пропускаете строку заголовка из file1.txt

f1 = {}
with open ("file1.txt") as file1:
    next(file1)  # skip the header (first line)
    for line in file1:  # for loop iterates over lines by default
        f1[line.split(",")[0]] = line.strip().split(",")[1:]

f2 = {}
with open ("file2.txt") as file2:
    for line in file2:
        f2[line.split(",")[0]] = line.strip().split(",")[1:]


# generate the contents of the new file
lines = [
    ['X', 'DES1', 'DES2', 'DES3', 'NUMBERS', 'NEWNUMB']  # headings
]
for key, value in f1.items():
    # get will return the second argument if the key doesn't exist
    new_num = f2.get(key, ['0'])
    # unpack the values into a new list and append it to lines
    lines.append([key, *value, *new_num])

for line in lines:
    print(','.join(line))

Вам нужно внести больше необходимых изменений в ваш код. Вы должны поэкспериментировать с этим и попробовать сделать это самостоятельно. Я просто исправил ошибку.

disciple@diptangsu:~/Desktop/sample$ cat file1.txt 
X, DES1, DES2, DES3, NUMBERS
123, text, text, text, 456
321, text, text, text, 43222
124, text, text, text, 3254
125, text, text, text, 2352634
279, text, text, text, 3243
567, text, text, text, 00001
345, text, text, text, 02
disciple@diptangsu:~/Desktop/sample$ cat file2.txt 
123, 152352364
124, 32535
125, 745734
345, 4000 
disciple@diptangsu:~/Desktop/sample$ python3 code.py 
X,DES1,DES2,DES3,NUMBERS,NEWNUMB
123, text, text, text, 456, 152352364
321, text, text, text, 43222,0
124, text, text, text, 3254, 32535
125, text, text, text, 2352634, 745734
279, text, text, text, 3243,0
567, text, text, text, 00001,0
345, text, text, text, 02, 4000

Если вы не знаете, что такое next, я предлагаю вам прочитать о генераторах в python.

...