从.txt文件(Python)中读取第N行

时间:2018-06-28 09:48:14

标签: python numpy matplotlib

我正在编写一个程序,该程序从.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 :(得分:0)

类似的内容仅每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]

然后,您可以将其应用于datesyz