В python, как мне объединить два текстовых файла, если разница может быть где угодно в тексте? - PullRequest
1 голос
/ 02 марта 2020

Теперь у меня есть список файлов, и я хочу объединить файлы с одинаковым серийным номером. Каждый файл содержит тысячи строк, и каждая строка имеет такой формат: дата, количество, чтение.

Например, первый файл:

"2019-12-23 00:00:00",1123,211685,34650.75,33225.69,...(hundreds of similar numbers)
 ...(hundreds of similar lines)
"2020-02-23 06:00:00",1372,211685,34651.22,33224.6,...
"2020-02-23 12:00:00",1373,211685,34650.34,33224.74,...

2-й файл:

"2019-12-17 12:00:00",1101,211685,34649.3,33225.8...
 ...
"2020-02-15 00:00:00",1339,211685,34651.66,33225.32,...
"2020-02-15 06:00:00",1340,211685,34651.63,33225.19...

Проблема в том, что пропущенные строки могут быть либо в начале, либо в конце файла. Первоначальные 100 показаний могут отсутствовать в одном файле, в то время как другой файл может пропустить последние 50 показаний. Интересно, что может быть лучшим способом объединить их? Я могу подумать об использовании «set», но я не уверен, что он способен добавить недостающие строки в середине файла.

Пример завершенных строк:

"2019-12-17 12:00:00",1101,211685,34649.3,33225.8...
 ...
"2019-12-23 00:00:00",1123,211685,34650.75,33225.69,...
 ...
"2020-02-15 00:00:00",1339,211685,34651.66,33225.32,...
"2020-02-15 06:00:00",1340,211685,34651.63,33225.19...
 ...
"2020-02-23 06:00:00",1372,211685,34651.22,33224.6,...
"2020-02-23 12:00:00",1373,211685,34650.34,33224.74,...

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Вы можете попробовать:

from datetime import datetime
from pprint import pprint
files = ["merge_01.txt", "merge_02.txt"]
all_lines = []
for file in files:
    with open(file) as f:
        all_lines += [x.strip() for x in f]

all_lines = list(set(all_lines))
all_lines.sort(key=lambda date: datetime.strptime(date[1:20], "%Y-%m-%d %H:%M:%S"))
pprint(all_lines)

with open("merge_all.txt", "w") as f:
    for line in all_lines:
        f.write(line+"\n")

['"2019-12-17 12:00:00",1101,211685,34649.3,33225.8',
 '"2019-12-23 00:00:00",1123,211685,34650.75,33225.69',
 '"2020-02-15 00:00:00",1339,211685,34651.66,33225.32',
 '"2020-02-15 06:00:00",1340,211685,34651.63,33225.19',
 '"2020-02-23 06:00:00",1372,211685,34651.22,33224.6',
 '"2020-02-23 12:00:00",1373,211685,34650.34,33224.74']

Демо


Pandas Решение:

import pandas as pd
files = ["merge_01.txt", "merge_02.txt"]
all_lines = []
for file in files:
    with open(file) as f:
        all_lines += list([x.strip().replace("\"", "") for x in f])

df = pd.DataFrame([sub.split(",") for sub in all_lines], columns=["date", "field1", "field2", "field3", "field4"])
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by='date').drop_duplicates()
df.to_csv('merged.csv', index=False)

Демо

1 голос
/ 02 марта 2020

set не поддерживает порядок, но вы можете отсортировать его позже, чтобы получить нужный выходной файл. Когда строка даты записывается как год-месяц-день-час-минута-секунда в UT C, тогда она может быть отсортирована либо по возрастанию, либо по убыванию, либо по убыванию без преобразования даты. Напишите по-американски «31 июня 2019 12:30 по московскому времени», и вам нужно будет преобразовать во что-нибудь сортируемое.

def merge_files(filenames, outfilename):
    rows = set()
    for filename in filenames:
        rows.update(open(filename))
    with open(outfilename, 'w') as fp:
        fp.writelines(sorted(rows))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...