Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2016 16:03:17

etopieto
Зарегистрирован: 2016-03-17
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

Доброе время суток!
Задача следующая :
Есть файл в формате Excel с данными. Данные - десятичные дроби типа 0.2159663 .
Необходимо по этим данным построить график.
С постройкой графа я разобрался. Файл в Excel я экспортирую в текстовый файл. Проблема в том, что формат текстового файла строгий, т.к. В коде я слайсами указываю расположение необходимых данных для построения графика.
Вопрос такой : можно ли уйти от этого строгого формата файла? Каким образом можно из текстового файла (данные в нем разделены табуляцией) брать десятичные дроби?
Заранее благодарю за помощь.

Офлайн

#2 Март 17, 2016 16:59:54

Vlad_Ki
Зарегистрирован: 2016-01-22
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

В консоли при вызове программы можно указывать файл откуда будут считываться данные в функцию input().
Пример вызова программы: python3 programm.py < file.txt
В коде создаешь какую нибудь коллекцию, которая тебе больше нравится и заполняешь ее данными из файла.
Если данные из файла разделены в одной строке, то можно сделать, к примеру, список из строк.

line = str(input())
spis = line.split("символ")
Аргумент методу split() задаешь в зависимости от того, по какому символу нужна разделить строку для создания списка значений.
Ну и дальше преобразуешь значения поочередно в float и тд.
Функция input() принимает целиком только одну строку из файла.
Это самый простой способ. Есть еще функция open(имя файла).
Тоже считывает построчно.
Можно использовать в цикле.
place = 0
xsp = []
for line in open(filename):
    if line in "\t":
        x =  line[place:len(line)]
        x = float(x)
        place += len(line)
        xsp += x



lol developer

Отредактировано Vlad_Ki (Март 17, 2016 19:58:30)

Офлайн

#3 Март 17, 2016 18:45:14

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

А почему бы не брать данные напрямую из экселевского файла?

Офлайн

#4 Март 17, 2016 19:55:29

etopieto
Зарегистрирован: 2016-03-17
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

Firik
А почему бы не брать данные напрямую из экселевского файла?
Подскажите, каким образом?

Офлайн

#5 Март 17, 2016 19:59:14

Vlad_Ki
Зарегистрирован: 2016-01-22
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

etopieto
Подскажите, каким образом?
Попробуй способы, которые я описал с файлом Exel



lol developer

Офлайн

#6 Март 17, 2016 20:37:18

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

etopieto
import csv
Это если в csv, стандартный модуль питона. За подробностями в гугл

Офлайн

#7 Март 18, 2016 08:58:45

etopieto
Зарегистрирован: 2016-03-17
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

На данном этапе, пока еще без правок, имею код:

import matplotlib.pyplot as plt
from os.path import exists

# Значения по оси X
X =

print(“Введите имя файла и путь к нему (например, c:\\folder\\filename.txt):”)
filename_new = input(“=> ”) # Вводим имя файла

# Цикл проверки имени файла
while exists(filename_new) != True:
print(“Файл с именем %r не существует.” % filename_new, ‘\n’)
print(“Введите имя файла:”, ‘\n’)
filename_new = input(“=> ”)

txt_new = open(filename_new) # Открываем файл, имя которого ввели вручную
print(“Данные из файла: %r” % filename_new)
stroka = txt_new.read()
print(stroka)
#print(txt_new.read(), ‘\n’) # Выводим на экран данные
txt_new.close()
stroka.split()

stroka_decimal = float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka)
print(“\n”, stroka_decimal,'\n')

print(“Значения Y_1:”)
Y_1 = stroka_decimal, stroka_decimal, stroka_decimal, stroka_decimal
print(Y_1, ‘\n’)

print(“Значения Y_2:”)
Y_2 = stroka_decimal, stroka_decimal, stroka_decimal, stroka_decimal
print(Y_2, ‘\n’)

print(“Значения Y_3:”)
Y_3 = stroka_decimal, stroka_decimal, stroka_decimal, stroka_decimal
print(Y_3)

# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.
line_1, line_2, line_3 = plt.plot(X, Y_1, ‘bD:’, X, Y_2, ‘r^:’, X, Y_3, ‘go:’)



# Задаем интервалы значений по осям X и Y
plt.axis()

# Задаем заголовок диаграммы
plt.title(u'Some relationship')

# Задаем подписи к осям X и Y
plt.xlabel(u'Axis X')
plt.ylabel(u'Axis Y')


# Включаем сетку
plt.grid()

# Сохраняем построенную диаграмму в файл
# Задаем имя файла и его тип
print(“Введите имя файла для сохранения графического изображения (без расширения \”.png\“):”)
filename_save = input(“=> ”) # Вводим имя файла
plt.savefig('d:\\test\\{}.{}'.format(filename_save, ‘png’))


Попробую сделать с учетом рекомендаций и отпишусь.

Офлайн

#8 Март 18, 2016 11:33:55

Vlad_Ki
Зарегистрирован: 2016-01-22
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

Редактируй пожалуйста свой код в теге для пайтон. А то глаза сломать можно.)
По тому, как извлекаются данные из файла, можно судить, что в файле только одна строка, которая тебе нужна, тк нет цикла, обрабатывающего остальные.
Из того что могу подсказать -
Метод:

stroka.split()
нужно прировнять к какой нибудь переменной тк после его вызова переменная stroka все еще остается в формате str,
И вызов этого метода разбивает твою строку по пробельным символам, а как я понял, тебе надо разбить по табуляции
("\t")
Или ты можешь воспользоваться методом stroka.expendtabs(1) и после него разбивать строку в список по пробельным символам.
Прочитай как пользоваться списками в пайтон. К обьектам списка следует обращаться по индексам. Это что касается:
stroka_decimal = float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka), float(stroka)
Это у тебя строка, хоть ты, наверное, предполагал, что список
stroka
и его нельзя привести во float. Только отдельные его обьекты через цикл for … in на пример.
В каждом вызове функции print() не обязательно указывать символ перевода строки тк в питоне он есть автоматически.
Ну и просто в качестве совета - лучше использовать метод s.format() для редактирования строк, а не процентик %. Больше простора для творчества. Это все, чем я могу помочь, уверен, что тут еще есть что порекомендовать, но в чем мог, в том помог.)




lol developer

Отредактировано Vlad_Ki (Март 18, 2016 11:41:43)

Офлайн

#9 Март 18, 2016 12:04:15

Vlad_Ki
Зарегистрирован: 2016-01-22
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

Совсем забыл: если у тебя в файле и правда только одна строка, то тебе, скорее всего, придется написать обработку исключения EOFError. Тоже самое надо сделать, если ты будешь писать цикл для обхода всех строк в файле.



lol developer

Отредактировано Vlad_Ki (Март 18, 2016 12:04:33)

Офлайн

#10 Март 18, 2016 21:15:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Импорт данных из файла Excel

etopieto
можно ли уйти от этого строгого формата файла?
Это вообще непонятно. Надо было привести фрагмент файла.
etopieto
Каким образом … брать десятичные дроби?
Снимаю шляпу перед вашим упорством. Обычно график делается как-то так:
import matplotlib.pyplot as plt
import numpy as np
Y=np.loadtxt("a.txt")
X=Y[:,0]
plt.plot(X,Y[:,1] , 'bD:', X, Y[:,2], 'r^:', X, Y[:,3], 'go:');plt.show()



Отредактировано doza_and (Март 18, 2016 21:15:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version