Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65

Графики в Python из csv файлов

16.03.2019, 13:45. Показов 8618. Ответов 7
Метки csv (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Появилась необходимость строить множество графиков из нескольких файлов csv. Раньше делал в Matlab, но сейчас слишком много файлов и каждый из них импортировать кажется нерациональным. Поэтому написал программку на Python. Она автоматом берет два файла из директории с именами A.csv и B.csv и формирует из данных график.
Но...
Теперь хочется уже сделать не чтобы работало, а чтобы работало хорошо. Хотелось бы чтобы не было ограничения на количество входных данных (файлов csv) и чтобы не нужно было переименовывать их в A и B. Просто чтобы программа искала в текущей директории все файлы с форматом CSV и выдавала все данные на график.
Рабочий код с двумя входными файлами прилагаю ниже:
Кликните здесь для просмотра всего текста
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
import os;
import matplotlib as mpl;
import matplotlib.pyplot as plt;
import csv;
 
def save(name='', fmt='png'):
    pwd = os.getcwd()
    iPath = './{}'.format(fmt)
    if not os.path.exists(iPath):
        os.mkdir(iPath)
    os.chdir(iPath)
    plt.savefig('{}.{}'.format(name, fmt), fmt='png')
    os.chdir(pwd)
    #plt.close()
 
A = [];
B = [];
C = [];
D = [];
 
with open('A.csv') as ff:
    csv_reader = csv.reader(ff, delimiter=',')
    count_lines = 0;
    for row in csv_reader:
        if count_lines < 20:
            count_lines = count_lines + 1;
        else:
            p = float(row[3]);
            A.append(p);
            p = float(row[4]) + 0.5;
            B.append(p);
            count_lines = count_lines + 1;
 
with open('B.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    count_lines = 0;
    for row in csv_reader:
        if count_lines < 20:
            count_lines = count_lines + 1;
        else:
            p = float(row[3]);
            C.append(p);
            p = (float(row[4])) / 10;
            D.append(p);
            count_lines = count_lines + 1;
 
fig = plt.figure(1);
plt.plot(A, B);
plt.plot(C, D);
plt.axis((-0.0005, 0.0005, -1, 2));
save(name='Figure', fmt='png');
plt.show();


И в принципе, хотелось бы посмотреть как опытные питонисты изменили бы код, чтобы он работал быстрее (хотя это не принципиально, т.к. главное результат, который кстати выглядит следующим образом:
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2019, 13:45
Ответы с готовыми решениями:

Python.csv.library создать функции удаления и редактирования данных о книге, хранящихся в csv
консольный интерфейс предполагает нажатие 1-5 клавиш со следующим функционалом: 1 - выводит список книг 2 - добавляет данные о новой...

Чтение из файлов timeline.csv и people.csv. Вывести информацию из них.
Добрый день!Есть задача,в которой надо вывести данные из файлов,никак не могу понять как реализовать её в виде кода. Есть два...

Разбиение CSV файла на много csv файлов по разделителю
Здравствуйте, есть файл в который нужно разделить, но не ровно по 30 строк например, а по 25, 23, 27. Как это можно сделать?

7
17 / 12 / 5
Регистрация: 21.07.2018
Сообщений: 59
16.03.2019, 18:31
Примерное содержимое csv файла , будьте любезны.
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
16.03.2019, 23:05  [ТС]
MasloriyKaryman, в CSV файле начиная с 19 строки нужны данные из 3 и 4 колонок. Там нецелые числа. По X - 3 столбец, по Y - 4 столбец. Всего 2500 строк.
0
17 / 12 / 5
Регистрация: 21.07.2018
Сообщений: 59
17.03.2019, 01:20
Кликните здесь для просмотра всего текста
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
import os
from itertools import islice
import matplotlib.pyplot as plt
import csv
 
def plot_file(path):
    x = []
    y = []
    with open(file=path, mode='r+', encoding='utf_8') as file:
        reader = islice(csv.reader(file, delimiter=','), 19, None)
        for row in reader:
            x.append(float(row[3]))
            y.append((float(row[4])) / 10)
    plt.plot(x,y)
 
def save(path, format):
    if not os.path.exists(os.path.dirname(path)):
        os.mkdir(os.path.dirname(path))
    plt.savefig(path, fmt=format)
 
if __name__ == '__main__':
    path = r'd:\plotting'
 
    fig = plt.figure(1);
 
    plt.axis((4, 10, 0, 2));
 
    for file in [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.csv')]:
        try:
            plot_file(file)
        except Exception as ex:
            print(ex)
 
 
    save(r'd:\plotting\summary.png','png');
    plt.show()


Что-то в этом роде. Понятное дело, что можно распараллелить , и еще каким-то образом оптимальнее реализовать.

В чём отличие от Вашего кода :
1. Cчитывание файла и его построение вынесено в цикл.
2. используется функция islice() - чтение файла начинается с 19 строки.

Вообще , если есть возможность, можно использовать pandas - тогда строчек кода станет еще меньше.
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
17.03.2019, 02:30  [ТС]
Цитата Сообщение от Letzins Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
p = float(row[3]);
A.append(p);
p = float(row[4]) + 0.5;
B.append(p);
...
p = float(row[3]);
C.append(p);
p = (float(row[4])) / 10;
D.append(p);
MasloriyKaryman, просто дело вот в чем. В цикл я не запихнул его, т.к. один график, нужно поднять относительно предыдущего (а каждый последующий делить на 10 в степени i, где i номер файла -1), а то они накладываются и получается нечто вроде этого:

Чтобы этого избежать, я просто к Y координате первого файла добавляю 0.5, а каждый последующий файл делю на 10 в степени "номер файла - 1". Это все происходит вследствие того, что эти данные получаются из осциллографа. А там своя система координат определяет выходные данные, т.е. синхронизирующий сигнал (первый файл) на уровне 0,5, а значит каждый последующий смещается на 0.5 вниз, и его выходные данные так же смещаются.
А вот с pandas пробовал, но документации особо не нашел и решил сделать средствами CSV.
0
17 / 12 / 5
Регистрация: 21.07.2018
Сообщений: 59
17.03.2019, 08:58
Так Вы про это ясно не указали.


В таком случае:


Чуть-чуть модернизируем функцию, добавляя счётчик

Python
1
2
3
4
5
6
7
8
9
def plot_file(path,counter):
    x = []
    y = []
    with open(file=path, mode='r+', encoding='utf_8') as file:
        reader = islice(csv.reader(file, delimiter=','), 19, None)
        for row in reader:
            x.append(float(row[3]))
            y.append(float(row[4]) + float(0.5 * counter) if(counter==1) else (float(row[4]))/ 10**(counter-1))
    plt.plot(x,y)

А сам цикл выглядит следующим образом:

Python
1
2
3
4
5
6
7
  counter = 1
    for file in [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.csv')]:
        try:
            plot_file(file,counter)
            counter = counter+1
        except Exception as ex:
            print(ex)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.03.2019, 12:30
Цитата Сообщение от Letzins Посмотреть сообщение
но документации особо не нашел
То есть 3 тысячи страниц офиц. (и очень хорошо структурированной) документации pandas вам не подошли?

Добавлено через 2 минуты
В pandas для чтения csv применяется функция pandas.read_csv, которая умеет все: и прочитать с нужной строчки, и автоматически определить delimiter и т.д.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
17.03.2019, 15:08
Garry Galler, Вы как всегда меня поражаете. А есть что-нибудь, чего Вы не знаете? )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2019, 15:08
Помогаю со студенческими работами здесь

PHP и .csv графики и анализ
Здравствуйте. Ситуация такая: есть статистика в файле формата .csv. Оттуда нужно вытаскивать определенные данные и строить на их основе...

Python работа с csv
Не работает программа, с csv не работал никогда. Помогите исправить ошибки. import csv FILENAME = &quot;Adidas.csv&quot; ...

Python работа с csv
Здравствуйте, у меня есть файл csv с 1000+ строками, помогите плиз выполнить следующие задания 2. Посчитать статистические показатели:...

Python, Tkinter, csv
Здравствуйте, попробую описать свою проблему, делаю курсовую работу и столкнулся с проблемой вывода на печать данных. Суть проблемы: У меня...

Python, модуль csv
Всем доброго времени суток. Столкнулся с такой проблемой, есть cvs файл , заполненный , кроме одного столбца. Сижу голову ломаю не могу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru