【问题标题】:Reading every Nth line from a .txt file (Python)从 .txt 文件中读取每 N 行(Python)
【发布时间】:2018-06-28 09:48:13
【问题描述】:

我正在制作一个程序,它从 .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-罗氏

用下面的代码搞定了:

@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()

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    这样的东西只会每 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

    【讨论】:

    • 这已经让我取得了一些不错的进步,谢谢!如果我用这个达到目标,将不得不更新。已经设法每 30 行打印一次,现在我只需要弄清楚如何绘制这些。
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2017-10-02
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多