Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708

Сортировка данных в файле по ключу

25.05.2021, 20:23. Показов 3737. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Без сериализации в json как то можно отсортировать данные в файле по ключу date:
{"name": "name_1", "date": "2021-05-25 18:26:21", "first_name": "first_name_1"}
{"name": "name_2", "date": "2021-05-25 18:26:22", "first_name": "first_name_1"}
{"name": "name_3", "date": "2021-05-25 18:26:22", "first_name": "first_name_1"}
{"name": "name_4", "date": "2021-05-25 18:26:29", "first_name": "first_name_1"}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2021, 20:23
Ответы с готовыми решениями:

MyDictionary: сортировка по ключу, поиск значения по ключу, поиск ключа по значению
Задан интерфейс ІMyDictionary. Его реализует класс MyDictionary, который позволяет определить коллекцию пар "ключ-значение". ...

Считывание данных из текстового файла и их запись в структурированный файл, сортировка данных в двоичном файле
Файлы: В текстовом файле находится информация о рейсах самолетов (электронное расписа-ние рейсов). Каждая запись в расписании имеет...

Сортировка данных в файле.
Нужно отсортировать данные в файле(положительные числа поставить в начало, отрицательные в конец). Для решения данной задачи решил ввести...

12
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 20:47
AlexMarkov, так они уже отсортированы!
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 20:49  [ТС]
iSmokeJC, тогда вот так
"""
{"name": "name_1", "date": "2021-05-25 18:26:21", "first_name": "first_name_1"}
{"name": "name_4", "date": "2021-05-25 19:26:29", "first_name": "first_name_1"}
{"name": "name_3", "date": "2021-05-25 18:30:22", "first_name": "first_name_1"}
{"name": "name_2", "date": "2021-05-25 18:26:22", "first_name": "first_name_1"}
"""
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 21:10
Лучший ответ Сообщение было отмечено AlexMarkov как решение

Решение

Python
1
2
3
4
5
import re
from dateutil import parser
 
with open('in.txt', 'r') as f_in:
    print(*sorted(f_in.readlines(), key=lambda x: parser.parse(re.search(r'(?<=")\d[-:\d ]+', x).group())))
Добавлено через 43 секунды
Bash
1
2
3
4
{"name": "name_1", "date": "2021-05-25 18:26:21", "first_name": "first_name_1"}
{"name": "name_2", "date": "2021-05-25 18:26:22", "first_name": "first_name_1"}
{"name": "name_3", "date": "2021-05-25 18:30:22", "first_name": "first_name_1"}
{"name": "name_4", "date": "2021-05-25 19:26:29", "first_name": "first_name_1"}
Добавлено через 6 минут
Вот так вернее
r'(?<="date": ")\d[-:\d ]+'
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 21:27  [ТС]
iSmokeJC, хотя нет что-то не работает, запись в файл возможна?
AttributeError: 'NoneType' object has no attribute 'group'

Добавлено через 4 минуты
iSmokeJC, за регулярное выражение спасибо...
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 21:50
Цитата Сообщение от AlexMarkov Посмотреть сообщение
что-то не работает
Что не работает?
Цитата Сообщение от AlexMarkov Посмотреть сообщение
запись в файл возможна?
А почему ж нет?

Добавлено через 28 секунд
Файл сюда прикрепи
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 22:13  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import os
import sys
import time
import dataclasses
import argparse
from pathlib import Path
import shutil
import json
import re
from dateutil.parser import parse
 
 
def time_of_function(function):
    """
    decorator time
    """
    def wrapped(*args):
        start_time = time.perf_counter()
        start_time_ns = time.perf_counter_ns()
        res = function(*args)
        print(f'seconds: {time.perf_counter() - start_time}')
        print(f'nsseconds: {time.perf_counter_ns() - start_time_ns}')
        return res
    return wrapped
 
@dataclasses.dataclass
class ParseArgs(object):
    """Commandline class"""
    def __init__(self):
        parser = argparse.ArgumentParser(description='Tool to generate test logs.')
 
        parser.add_argument(
            'input_dir_1',
            metavar='<INPUT DIR1>',
            type=str,
            help=f'path to dir with generated logs_a',
        )
 
        parser.add_argument(
            'input_dir_2',
            metavar='<INPUT DIR2>',
            type=str,
            help=f'path to dir with generated logs_b',
        )
 
        parser.add_argument(
            '-o',
            '--out',
            metavar='<OUTPUT DIR>',
            type=str,
            default=os.getcwd(),
            help=f'path to dir with output file',
        )
 
        parser.add_argument(
            '-f', '--force',
            action='store_const',
            const=True,
            default=False,
            help='force write log',
            dest='force_write',
        )
 
        self.args = parser.parse_args()
 
    def parse_dir(self) -> list:
        """
        directory return function
        a = ParseArgs()
        a.parse_dir()[0] - path dir file_a
        a.parse_dir()[1] - path dir file_b
        a.parse_dir()[2] - path dir file_out
        """
        return [os.path.dirname(self.args.input_dir_1), os.path.dirname(self.args.input_dir_2), os.path.dirname(self.args.out)]
 
    def parse_filename(self) -> list:
        """
        filenames return function
        a = ParseArgs()
        a.parse_filename()[0] - filename file_a
        a.parse_filename()[1] - filename file_b
        """
        return [os.path.basename(self.args.input_dir_1), os.path.basename(self.args.input_dir_2)]
 
@dataclasses.dataclass
class CreateDir(object):
    """File-out directory class
    dir_path = Path(a.parse_dir()[-1])
    b = CreateDir(dir_path, force_write=args.force_write)
    """
    def __init__(self, dir_path: Path, *, force_write: bool = False) -> None:
        if dir_path.exists():
            if not force_write:
                raise FileExistsError(
                    f'Dir "{dir_path}" already exists. Remove it first or choose another one.')
            shutil.rmtree(dir_path)
        dir_path.mkdir(parents=True)
 
    def func(self):
        """
        new function
        """
        pass
 
@dataclasses.dataclass
class MergeLogFiles(object):
    """A class for merging files"""
    def __init__(self):
        a = ParseArgs()
        self.args = a.args
        self.file_a = args.input_dir_1
        self.file_b = args.input_dir_2
        self.file_out = args.out
 
    @time_of_function
    def jsonl_file(self):
        for infile in self.file_a,self.file_b:
            with open(infile, 'r') as file:
                with open(self.file_out, 'a+') as write_file:
                    for line in file:
                        write_file.write(line)
    @time_of_function
    def jsonl_sorted(self):
        with open(self.file_out, 'r') as f_in:
            print(*sorted(f_in.readlines(), key=lambda x: parse(re.search(r'(?<="date": ")\d[-:\d ]+', x).group())))
 
 
if __name__ == '__main__':
    # Arguments
    a = ParseArgs()
    args = a.args
    # Create dir
    dir_path = Path(a.parse_dir()[-1])
    b = CreateDir(dir_path, force_write=args.force_write)
    # Merge logs
    c = MergeLogFiles()
    c.jsonl_file()
    c.jsonl_sorted()
Добавлено через 1 минуту
iSmokeJC, совсем нет времени разбираться с dateutil, был бы рад любой помощи...

Добавлено через 6 минут
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{"log_level": "DEBUG", "timestamp": "2021-05-25 22:07:38", "message": "Leela robbed a fish in L.A. day after tomorrow"}
{"log_level": "DEBUG", "timestamp": "2021-05-25 22:07:38", "message": "Amy ate a car at park day after tomorrow"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:07:40", "message": "Amy saw a mall at park day after tomorrow"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:07:44", "message": "Leela took a bottle of bear near the Square Garden today"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:07:52", "message": "Leela ate a man on the Mars tomorrow"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:07:53", "message": "Dr. Zoidberg built a rocket at park day after tomorrow"}
{"log_level": "WARNING", "timestamp": "2021-05-25 22:07:54", "message": "Leela saw a mall near the Square Garden tomorrow"}
{"log_level": "WARNING", "timestamp": "2021-05-25 22:07:58", "message": "Farnsworth robbed a car in L.A. tomorrow"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:06", "message": "Dr. Zoidberg played a bottle of bear near the Square Garden day before yesterday"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:11", "message": "Amy saw a fish near the Square Garden yesterday"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:17", "message": "Leela killed a rocket on the Mars today"}
{"log_level": "DEBUG", "timestamp": "2021-05-25 22:08:19", "message": "Leela took a boat near the Square Garden today"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:08:23", "message": "Bender killed a rocket near the Square Garden day after tomorrow"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:08:25", "message": "Fry ate a bottle of bear at park yesterday"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:26", "message": "Leela ate a man in L.A. today"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:35", "message": "Dr. Zoidberg killed a rocket in L.A. today"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:08:41", "message": "Fry built a fish in L.A. yesterday"}
{"log_level": "WARNING", "timestamp": "2021-05-25 22:08:43", "message": "Amy said a mall near the Square Garden yesterday"}
{"log_level": "WARNING", "timestamp": "2021-05-25 22:08:46", "message": "Fry said a mall in L.A. tomorrow"}
{"log_level": "ERROR", "timestamp": "2021-05-25 22:08:50", "message": "Amy killed a rocket on the Mars today"}
{"log_level": "WARNING", "timestamp": "2021-05-25 22:08:54", "message": "Bender built an apple on the Mars day before yesterday"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:09:02", "message": "Amy took a mall near the Square Garden today"}
{"log_level": "INFO", "timestamp": "2021-05-25 22:09:09", "message": "Dr. Zoidberg brought an apple near the Square Garden tomorrow"}
Как то так, а далее...
Вы ввели слишком длинный текст (2114686 символов). Пожалуйста, сократите его до 25000 символов.

Добавлено через 1 минуту
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Файл сюда прикрепи
2 gb
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 22:14
AlexMarkov, а, ну тогда первый вариант регулярки должен работать
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 22:18  [ТС]
iSmokeJC, а "ето" что за проблема AttributeError: 'NoneType' object has no attribute 'group', ладно завтра, спасибо...
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 22:20
AlexMarkov, это регулярка не совпала

Добавлено через 1 минуту
Возможно проскакивают строки не с таким же содежимым
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 22:23  [ТС]
iSmokeJC, Вы правы...
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.05.2021, 22:25
AlexMarkov, это можно обойти, но вот что с ними делать-то?

Добавлено через 41 секунду
Если есть примеры этих "бракованых" строк, давай
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.05.2021, 22:30  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Если есть примеры этих "бракованых" строк, давай
все ок...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2021, 22:30
Помогаю со студенческими работами здесь

Сортировка данных в файле
В файле находится список имен. Нужно, чтобы программа рассортировала по алфавиту эти имена. Число имен в файле 20. Большая просьба, чтобы...

Сортировка данных в файле
У меня есть написанная программа. Открывает текстовые файлы, сортирует в них данные. Помогите дописать корректировку данных, при нажатии...

Сортировка данных в файле
Есть файл, данные которого вносятся вначале в Listbox? Потом эти данные сортируются. Одна кнопка для сортировки по алфавиту( буква...

Сортировка данных в файле
Написать КФ SORT_FD.BAT для сортировки файла данных по алфавиту (по возрастанию или убыванию) со следующими программными функциями: ...

Сортировка данных в файле
в файле содержится информация со статистикой посещения сайта на протяжении недели, каждая запись содержит ip адрес,время посещения и день...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru