Чтение каждой N-й строки из файла .txt (Python) - PullRequest
0 голосов
/ 28 июня 2018

Я делаю программу, которая читает значения времени и показания из файла .txt и выводит их на веб-страницу с помощью matplotlib. В моем случае есть много значений, и график может выглядеть очень запутанным, и с тысячами точек данных он также может быть вялым.

В настоящее время я читаю строки .txt с этим кодом, чтобы поместить значения в списки графиков:

with open('C:/Email/file.txt') as f:   


    lines = f.readlines()



    dates = [str(line.split(';')[0]) for line in lines]
    y = [float(line.split(';')[1]) for line in lines]
    z = [float(line.split()[2]) for line in lines]

Содержимое файла .txt выглядит следующим образом:

30.05.18_12:27:17;  13.0;  -0.0
30.05.18_12:27:18;  14.0;  -0.0
30.05.18_12:27:19;  15.0;  -0.0
30.05.18_12:27:20;  16.0;  -0.0

Итак, есть ли способ прочитать и построить каждую N-ю (например, каждые 30. было бы идеально) временную метку и значение?

Я исследовал разные способы, но они кажутся запутанными.

Одним из решений, о котором я думал, является создание счетчика, который подсчитывает количество прочитанных строк, затем, когда счетчик равен 30, пропускает 30 следующих строк и считывает и отображает данные в строке 31. Я понятия не имею, как чтобы сделать это, так как я относительно новичок в Python.

Помощь будет оценена.

На всякий случай весь код здесь:

from flask import Flask
import numpy as np
import matplotlib.pyplot as plt, mpld3
from datetime import datetime

app = Flask(__name__)



@app.route("/")
def hello():

    with open('C:/Email/file.txt') as f:   


        lines = f.readlines()



        dates = [str(line.split(';')[0]) for line in lines]
        y = [float(line.split(';')[1]) for line in lines]
        z = [float(line.split()[2]) for line in lines]


        date = [datetime.strptime(x,'%d.%m.%y_%H:%M:%S') for x in dates]
        plt.figure(figsize=(10,5))
        plt.title('Temperature', fontsize=15)
        plt.ylabel('Temperature' + u'\u2103', fontsize=15)

        plt.plot_date(date, y, 'r-', label='quadratic')
        plt.ylim([10,35])

        # Print as HTML
        return mpld3.show()

if __name__ == "__main__":
    app.run()

РЕДАКТИРОВАТЬ: ОГРОМНОЕ СПАСИБО MR. F-ROCHE

Получил работу со следующим кодом:

@app.route("/")
def hello():

    with open('C:/Email/file.txt') as f:   

        # Counts lines in text (Use later to delete lines every X readings)
        # lines = f.readlines()
        cpt = 0
        all_lines = []
        for line in f:
            cpt += 1
            if cpt == 30:
                all_lines.append(line)
                cpt = 0
        dates = [str(line.split(';')[0]) for line in all_lines]
        date = [datetime.strptime(x,'%d.%m.%y_%H:%M:%S') for x in dates]
        y = [float(line.split(';')[1]) for line in all_lines]
        z = [float(line.split()[2]) for line in all_lines]

        plt.figure(figsize=(10,5))
        plt.title('Temperature', fontsize=15)
        plt.ylabel('Temperature' + u'\u2103', fontsize=15)


        plt.plot_date(date, y, 'r-', label='quadratic')
        plt.ylim([10,35])

        # Print as HTML
        return mpld3.show()

1 Ответ

0 голосов
/ 28 июня 2018

Нечто подобное будет отображаться только через каждые 30 строк:

with open('C:/Email/file.txt') as f:
    cpt = 0
    for line in f:
        cpt += 1
        if cpt == 30:
            print(line)
            cpt = 0

Вы можете поместить переменную line в список, подобный этому:

all_lines = []
...
all_lines.append(line)

РЕДАКТИРОВАТЬ: или даже лучше с одной строкой кода:

with open('C:/Email/file.txt') as f:
    all_lines = [v for i, v in enumerate(f, start=1) if i % 30 == 0]

Затем вы можете применить это к dates, y и z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...