Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 15.03.2016
Сообщений: 29

Считывание массива данных с файла в модель

11.02.2019, 20:31. Показов 1276. Ответов 10

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть:
model.py:
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
from PyQt5 import QtCore
import numpy as np
 
 
class DataModel(QtCore.QAbstractTableModel):
 
    modelChanged = QtCore.pyqtSignal()
 
    def __init(self):
        super(DataModel, self).__init__()
        self.arr = np.zeros(shape=(0, 0))
 
    def set_arr(self, arr):
        self.arr = arr
        self.res_model()
 
    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.arr)
 
    def columnCount(self, parent=QtCore.QModelIndex()):
        return len(self.arr[0])
 
    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid() or role != QtCore.Qt.DisplayRole:
            return None
        return str(self.arr[index.row()][index.column()])
 
    def headerData(self, section, orientation, role):
        if role != QtCore.Qt.DisplayRole:
            return None
        if orientation == QtCore.Qt.Vertical:
            return str(section)
        elif orientation == QtCore.Qt.Horizontal:
            if section == 0:
                return 'Elapsed time, hrs'
            elif section == 1:
                return 'Pressure'
 
    def get_arr(self):
        return self.arr
 
    def res_model(self):
        self.beginResetModel()
        self.endResetModel()
        self.modelChanged.emit()
Что я хочу:
1. Создать модель
2. Присвоить tableView эту модель методом setModel
3. Считать с файла массив (у меня это всегда два столбца вроде (X, Y))
4. Методом model.set_array скормить модели этот массив

view.py:
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
from ui.form import Ui_MainWindow
from my_model import DataModel
import numpy as np
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtGui
 
 
class DataView(QMainWindow, Ui_MainWindow ):
    def __init__(self):
        super(DataView, self).__init__()
        self.setupUi(self)
 
        self.model = DataModel()
        self.model.set_arr(np.zeros(shape=(0, 2))) 
        self.tableView.setModel(self.model)
 
        self.load_btn.clicked.connect(self.open_file)
 
 
    # функция возвращает файл
    def open_file(self):
        f = QtGui.QFileDialog.getOpenFileName(self,
                                              'Single file',
                                              'C:\Work\Project\DataProcessing\data examples',
                                              '*.txt')
        return f
 
    # запись .txt файла в np.ndarray
    def read_from_file(self):
        time = np.loadtxt(self.open_file(), usecols=0)
        pressure = np.loadtxt(self.open_file(), usecols=1)
        return np.vstack((time, pressure)).transpose()
У меня пара вопросов:
1. Почему если закомментить set_arr - ничего не работает - это связано с тем, как я изначально определил модель? То есть в моем случае никак нельзя сделать setModel, а уже потом set_arr?
2. Для того, чтобы считать с файла массив и занести его в model.set_arr, нужно ли этот числовой массив сконвертировать в строковый?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2019, 20:31
Ответы с готовыми решениями:

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

Заменить считывание данных из файла на считывание с TextBox
Добрый день! Прошу помочь пожалуйста новичку в C#. Есть код нужно его преобразовать немного, чтобы шифруемые данные брались не из...

Запрос данных из файла. Проблема в открывании файла и считывание из него данных
Не понимаю что не так, программа не хочет открывать файл... Пробовал и перемещать его, и использовать другие команды для его вызова... (Щас...

10
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
11.02.2019, 20:47
Цитата Сообщение от dfds Посмотреть сообщение
если закомментить set_arr - ничего не работает
Где именно вы его комментите?

Цитата Сообщение от dfds Посмотреть сообщение
Для того, чтобы считать с файла массив и занести его в model.set_arr, нужно ли этот числовой массив сконвертировать в строковый?
Не понятно, что вы хотите сделать
1
1 / 1 / 0
Регистрация: 15.03.2016
Сообщений: 29
11.02.2019, 20:53  [ТС]
tooru

комменчу в файле view.py , 14 строка

хочу во view.py сделать следующее:
1. создать модель как
Python
1
2
self.model = DataModel()
self.tableView.setModel(self.model)
А далее уже, например, нажав на button выбрать файл, считать его в np.ndarray и сделать следующее:
Python
1
self.model.set_arr(/np.ndarray/)
Но у меня, пока я не задам модели массив через self.model.set_arr не получается сделать view.setModel(model)
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
11.02.2019, 21:14
Опечатка, __init__ не правильно написан в классе DataModel и поле arr не создается
1
1 / 1 / 0
Регистрация: 15.03.2016
Сообщений: 29
11.02.2019, 21:27  [ТС]
tooru
Спасибо! Совсем уже ничего не вижу
Но теперь у меня другая проблема: если я делаю следующее
Python
1
2
3
4
5
6
# связываю кнопку со слотом открытия файла
self.load_btn.clicked.connect(self.open_file)
# считываю файл в массив
data = self.read_from_file
# отдаю массив модели
self.model.set_arr(data)
, то при запуске программы сразу появляется диалоговое окно с выбором файлов (как я понимаю, из-за того, что
Python
1
data = self.read_from_file
связано с открытием диалогового окна)
А при выборе файла кидает
Python
1
ValueError: could not convert string to float
Получается, правильнее будет сначала считать строки, а потом их распарсить? Данные у меня вида (double)/t(double)/n

Python
1
2
3
4
5
6
7
8
9
10
11
    def open_file(self):
        f = QtGui.QFileDialog.getOpenFileName(self,
                                              'Single file',
                                              'C:\Work\Project\DataProcessing\data examples',
                                              '*.txt')
        return f
 
    def read_from_file(self):
        time = np.loadtxt(self.open_file(), usecols=0)
        pressure = np.loadtxt(self.open_file(), usecols=1)
        return np.vstack((time, pressure)).transpose()
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
11.02.2019, 21:36
В справке по функции loadtxt https://docs.scipy.org/doc/num... light=load, написано, что разделитель по умолчанию пробел, а так как в вашем случае разделитель таб, то нужно указать параметр delimiter
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
12.02.2019, 18:08
Цитата Сообщение от dfds Посмотреть сообщение
То есть в моем случае никак нельзя сделать setModel, а уже потом set_arr?
После setModel начинают вызываться функции модели. Массива нет - всё, капец, программа плохо себя чувствует.
Теоретически можно нашпиговать вашу модель if-ами на этот случай, но зачем? Делайте сначала модель с массивом, а setModel потом. И даже более того - советую вам передавать массив в конструктор, чтобы присваивание происходило только один раз. Новый массив - новая модель.
1
1 / 1 / 0
Регистрация: 15.03.2016
Сообщений: 29
12.02.2019, 18:13  [ТС]
dondublon, здравствуйте. Про Ваше замечание - спасибо, надо бы переделать, да, так как сейчас началось такое, что я обновляю модель через кнопку, а графики не перерисовываются, нужно еще с сигналами разобраться.

По поводу считывания в файл, может кому поможет в дальнейшем:

Python
1
2
3
4
5
6
7
8
    def read_from_txt(self):
        file_path = QFileDialog.getOpenFileName(self,
                                                'Open file',
                                                '~\data examples')
        arr = np.vstack((np.loadtxt(file_path[0], usecols=0),
                               np.loadtxt(file_path[0], usecols=1))).transpose()
        self.model.set_arr(arr)
        self.curr_data = self.model.get_arr()
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
12.02.2019, 18:20
Цитата Сообщение от dfds Посмотреть сообщение
arr = np.vstack((np.loadtxt(file_path[0], usecols=0), np.loadtxt(file_path[0], usecols=1))).transpose()
А зачем вы читаете файл дважды? Посмотрите внимательнее параметр usecols.
Да и transpose вряд ли нужен.
0
1 / 1 / 0
Регистрация: 15.03.2016
Сообщений: 29
12.02.2019, 18:25  [ТС]
dondublon
упс =) оставил так, так как здесь следующая идея: файл вида "double \t double \n", в модель мне нужно засунуть np.ndarray, который я создаю через np.vstack, куда на вход идут как раз таки два столбца с числами double
наверное, это называется костыль, пока что оставил так
Без транспонирования я получаю вектор-строки, и соотв-но в tableView отображение идет как две строки и n столбцов, а мне (и глазу) надо наоборот
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
13.02.2019, 10:49
Цитата Сообщение от dfds Посмотреть сообщение
файл вида "double \t double \n",
Тогда вам вообще не надо указывать usecols.
Цитата Сообщение от dfds Посмотреть сообщение
я создаю через np.vstack,
А зачем? loadtxt всё и так читает в столбцы. Попробуйте его в чистом виде, без примесей.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2019, 10:49
Помогаю со студенческими работами здесь

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

Считывание из текстового файла выборочных данных, сортировка данных по возрастанию и последующая запись в другой файл
Дан файл: 0.3000000E+01 0.1000000E+03 501 1 1 0.00000000E+00 0.00000000E+00 2...

Выполните считывание данных из текстового файла через символ и записи прочитанных данных в другой текстовый файл
Помогите выполнить задание на python: Выполните считывание данных из текстового файла через символ и записи прочитанных данных в другой...

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

Считывание введенных данных, определение их типа и сохранение в виде массива данных
Написать программу, которая осуществляет считывание в веденных данных, определяет их тип и сохраняет в виде массива данных. Результатом...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru