python学习——读取txt文件数据并画图

本文详细介绍了如何使用Python从TXT文件中读取数据,并利用matplotlib库进行数据可视化,包括处理数据中的空行、提取特定字段及绘制多张图表或整合在同一图表中的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.读取txt,准备数据

这里主要用到列表list的split()函数,先简单举个例子:

# 要从line字符串中提取1.598912和2.104217两个数据
line = 'step 0: dis loss 1.598912, gan loss 2.104217'
temp = line.split('loss ')
print(temp)
t = temp[1].split(',')
print(t[0])
print(temp[2])

很简单,看下运行结果就能懂。
在这里插入图片描述
好了,我们正式开始从文件中读取数据:
training_log.txt文件中数据格式如下,注意每行数据后多了一空行,准备数据时,新建.txt文件,将下面这部分直接复制到文件中,注意.txt文件要放在.py文件同一目录下

step 0: dis loss 1.598912, gan loss 2.104217
 
step 1: dis loss 0.732674, gan loss 3.946449
 
step 2: dis loss 0.573478, gan loss 3.388427
 
step 3: dis loss 0.680266, gan loss 5.132270
 
step 4: dis loss 0.663417, gan loss 2.586611
 
step 5: dis loss 0.958724, gan loss 7.208553
 
step 6: dis loss 0.736339, gan loss 7.141296
 
step 7: dis loss 0.502748, gan loss 2.121268
 
step 8: dis loss 1.547100, gan loss 9.549424

法1:因为数据中有空行,这里用了i来控制

filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
    # 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。
    # 然后将每个元素中的不同信息提取出来
    lines = f.readlines() 
    # i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要
    # j用于判断读了多少条,step为画图的X轴
    i = 0
    j = 0
    for line in lines:
        if i % 2 == 0:
            temp = line.split('loss ')
            t = temp[1].split(',')
            step.append(j)
            j = j + 1
            dis.append(float(t[0]))
            gan.append(float(temp[2]))
            i = i + 1
        else:
            i = i + 1

PS:如果你的程序总是出错,那可能是你的.txt中数据的格式有问题,很可能是中间或者最后多了空行,导致出错,可以试着在上面程序的分割字符串部分加上try except语句,像这样:

            try:
                temp = line.split('loss ')
                t = temp[1].split(',')
            except:
                continue

法2:如果这样做,那就不需要变量i来控制读入的行数,程序可以直接这么写(这样写容错率更高,推荐这样写)

filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
    # 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。
    # 然后将每个元素中的不同信息提取出来
    lines = f.readlines()
    # j用于判断读了多少条,step为画图的X轴
    j = 0
    for line in lines:
        try:
            temp = line.split('loss ')
            t = temp[1].split(',')
        except:
            continue
        step.append(j)
        j = j + 1
        dis.append(float(t[0]))
        gan.append(float(temp[2]))

数据准备完成,此时step, dis, gan三个list中存储了X,Y1,Y2的值,接下来画图

2.使用matplotlib画图

1.如果分别画两张图:

from matplotlib import pyplot as plt
 
fig = plt.figure(figsize=(10, 10))  # 创建绘图窗口,并设置窗口大小
# 画第一张图
ax1 = fig.add_subplot(211)  # 将画面分割为2行1列选第一个
ax1.plot(step, dis, 'red', label='dis')  # 画dis-loss的值,颜色红
ax1.legend(loc='upper right')  # 绘制图例,plot()中的label值
ax1.set_xlabel('step')  # 设置X轴名称
ax1.set_ylabel('Discriminator-loss')  # 设置Y轴名称
# 画第二张图
ax2 = fig.add_subplot(212)  # 将画面分割为2行1列选第二个
ax2.plot(step, gan, 'blue', label='gan')  # 画gan-loss的值,颜色蓝
ax2.legend(loc='upper right')  # loc为图例位置,设置在右上方,(右下方为lower right)
ax2.set_xlabel('step')
ax2.set_ylabel('Generator-loss')
plt.show()  # 显示绘制的图

绘制效果:
在这里插入图片描述
2.画在一张图中

from matplotlib import pyplot as plt
 
plt.figure()
plt.plot(step, dis, 'red', label='dis')
plt.plot(step, gan, 'blue', label='gan')
plt.legend()
plt.show()

绘制效果:
在这里插入图片描述
下面放完整代码:

from matplotlib import pyplot as plt
 
filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
    # 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。然后将每个元素中的不同信息提取出来
    lines = f.readlines()
    # i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要
    # j用于判断读了多少条,step为画图的X轴
    i = 0
    j = 0
    for line in lines:
        if i % 2 == 0:
            temp = line.split('loss ')
            t = temp[1].split(',')
            step.append(j)
            j = j + 1
            dis.append(float(t[0]))
            gan.append(float(temp[2]))
            i = i + 1
        else:
            i = i + 1
 
fig = plt.figure(figsize=(10, 5))  # 创建绘图窗口,并设置窗口大小
# 画第一张图
ax1 = fig.add_subplot(211)  # 将画面分割为2行1列选第一个
ax1.plot(step, dis, 'red', label='dis')  # 画dis-loss的值,颜色红
ax1.legend(loc='upper right')  # 绘制图例,plot()中的label值
ax1.set_xlabel('step')  # 设置X轴名称
ax1.set_ylabel('Discriminator-loss')  # 设置Y轴名称
# 画第二张图
ax2 = fig.add_subplot(212)  # 将画面分割为2行1列选第二个
ax2.plot(step, gan, 'blue', label='gan')  # 画gan-loss的值,颜色蓝
ax2.legend(loc='upper right')  # loc为图例位置,设置在右上方,(右下方为lower right)
ax2.set_xlabel('step')
ax2.set_ylabel('Generator-loss')
plt.show()  # 显示绘制的图
 
plt.figure()
plt.plot(step, dis, 'red', label='dis')
plt.plot(step, gan, 'blue', label='gan')
plt.legend()
plt.show()

参考博文:

Python 绘图,我只用 Matplotlib(二)
python读取txt天气数据并使用matplotlib模块绘图

### 如何使用 Python 读取 CSV 文件绘制图表 要实现通过 Python 读取 CSV 文件绘制图表的功能,可以按照以下方法操作。以下是详细的说明以及示例代码。 #### 使用 `pandas` 和 `matplotlib` 处理数据和绘图 Python 中常用的库有 `pandas` 来处理表格型数据,而 `matplotlib` 或者更高级的 `seaborn` 可用于可视化。下面是一个完整的例子来展示如何完成这一任务: ```python import pandas as pd import matplotlib.pyplot as plt # 假设有一个名为 data.csv 的文件 filename = 'data.csv' # 使用 pandas 读取 CSV 文件 df = pd.read_csv(filename) # 打印前几行查看数据结构 print(df.head()) # 绘制简单的折线图 (假设存在两列:'Year', 'Value') plt.figure(figsize=(10, 6)) plt.plot(df['Year'], df['Value'], marker='o') # 添加标题和标签 plt.title('Data Visualization Example') plt.xlabel('Year') plt.ylabel('Value') # 显示网格 plt.grid(True) # 展示图像 plt.show() ``` 此代码片段展示了如何加载一个 CSV 文件到 DataFrame 基于其中的数据生成一张基本的折线图[^4]。 #### 示例 CSV 文件格式 这里提供了一个简单的 CSV 文件内容作为参考,您可以将其保存为 `data.csv`: ```csv Year,Value 2010,50 2011,70 2012,80 2013,90 2014,100 2015,120 2016,150 2017,180 2018,200 2019,220 2020,250 ``` 这个 CSV 文件包含了两个字段——年份 (`Year`) 和对应的数值 (`Value`),适合用来演示时间序列数据分析中的常见场景[^5]。 #### 注意事项 当涉及到多个 CSV 文件时,可以通过循环遍历目录下的所有文件逐一处理而不必合它们。例如利用标准库中的 `glob` 模块找到匹配模式的所有路径名[^6]: ```python import glob for filepath in glob.glob('./path/to/csv/*.csv'): temp_df = pd.read_csv(filepath) # 对每个单独的 dataframe 进行必要的预处理或绘图工作... ``` 这样就可以针对每一个独立的 CSV 文件执行特定的操作或者生成各自的图表了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值