Найти - Пользователи
Полная версия: Импорт данных из файла Excel
Начало » Центр помощи » Импорт данных из файла Excel
1
etopieto
Доброе время суток!
Задача следующая :
Есть файл в формате Excel с данными. Данные - десятичные дроби типа 0.2159663 .
Необходимо по этим данным построить график.
С постройкой графа я разобрался. Файл в Excel я экспортирую в текстовый файл. Проблема в том, что формат текстового файла строгий, т.к. В коде я слайсами указываю расположение необходимых данных для построения графика.
Вопрос такой : можно ли уйти от этого строгого формата файла? Каким образом можно из текстового файла (данные в нем разделены табуляцией) брать десятичные дроби?
Заранее благодарю за помощь.
Vlad_Ki
В консоли при вызове программы можно указывать файл откуда будут считываться данные в функцию 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
Firik
А почему бы не брать данные напрямую из экселевского файла?
etopieto
Firik
А почему бы не брать данные напрямую из экселевского файла?
Подскажите, каким образом?
Vlad_Ki
etopieto
Подскажите, каким образом?
Попробуй способы, которые я описал с файлом Exel
Firik
etopieto
import csv
Это если в csv, стандартный модуль питона. За подробностями в гугл
etopieto
На данном этапе, пока еще без правок, имею код:

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’))


Попробую сделать с учетом рекомендаций и отпишусь.
Vlad_Ki
Редактируй пожалуйста свой код в теге для пайтон. А то глаза сломать можно.)
По тому, как извлекаются данные из файла, можно судить, что в файле только одна строка, которая тебе нужна, тк нет цикла, обрабатывающего остальные.
Из того что могу подсказать -
Метод:
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() для редактирования строк, а не процентик %. Больше простора для творчества. Это все, чем я могу помочь, уверен, что тут еще есть что порекомендовать, но в чем мог, в том помог.)


Vlad_Ki
Совсем забыл: если у тебя в файле и правда только одна строка, то тебе, скорее всего, придется написать обработку исключения EOFError. Тоже самое надо сделать, если ты будешь писать цикл для обхода всех строк в файле.
doza_and
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB