大家好,又见面了,我是你们的朋友全栈君。
1,使用python读取txt文件
已知txt文件内容如下:
代码语言:javascript复制 0 0
1 1
2 4
3 9
4 16
5 25
6 36
- 1
- 2
- 3
- 4
- 5
- 6
- 7
请以第一列为x轴,第二列为y轴画图 步骤如下: 1)使用readlines读取文件 2)建立两个空列表X,Y,将第一列的数字放入X,第二列的数字放入Y中 3)以X,Y为轴画图 实现如下:
代码语言:text复制import matplotlib.pyplot as plt
filename = 'test1.txt'
X,Y = [],[]
with open(filename, 'r') as f:#1
lines = f.readlines()#2
for line in lines:#3
value = [float(s) for s in line.split()]#4
X.append(value[0])#5
Y.append(value[1])
print(X)
print(Y)
plt.plot(X, Y)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
步骤讲解: 1,以只读形式打开文件 2,读取每行文件,lines的结果是:
代码语言:text复制['t0t0n', 't1t1n', 't2t4n', 't3t9n', 't4t16n', 't5t25n', 't6t36']
- 1
即已将文件放到一个list中,其中t是前面的tab空格,n是换行。现在要将这些t,n去掉,使用split函数。 但需要注意split()不可以用在list中,因为list没有split()函数,只有str才有,也就是说lines.split()会报错;但lines[i].split() for i in lines不会,因为lines[0]到lines[6]等每个元素都是列表中的一个str类型,所以每个元素可以用split()函数,如下:
代码语言:text复制>>> type(lines[0])
<class 'str'>
>>> type(lines)
<class 'list'>
>>> lines[0].split()
['0', '0']
>>> lines.split()
Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
lines.split()
AttributeError: 'list' object has no attribute 'split'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
float将str里面的字符改为数字 5因为是for循环,所以每次只有两个数字,即一行中的两个,于是总是将第一个放在X中,第二个放在Y中,最后输出X,Y如下:
代码语言:json复制[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
[0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0]
- 1
- 2
可见这正是我们要的结果,同时画图如下:
2)优化代码
上面的代码有些繁琐(但却是很中规中矩的),可以采用方法以下优化 代码如下:
代码语言:text复制X, Y = [], []
for line in open('my_data.txt', 'r'):
values = [float(s) for s in line.split()]
X.append(values[0])
Y.append(values[1])
plt.plot(X, Y)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
还可以进一步优化(列表解析法list conprehension)
代码语言:text复制import matplotlib.pyplot as plt
with open('test1.txt', 'r') as f:
X, Y = zip(*[[float(s) for s in line.split()] for line in f])
plt.plot(X, Y)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
这种方法的好处是,如果有很多列,可以直接在赋值号左边加值,如X,Y,Z,W =….
解释:以上调用了zip函数,zip函数的用法可以参考博文frydsh
3,使用numpy
代码如下:
代码语言:text复制import matplotlib.pyplot as plt
import numpy as np
data = np.loadtxt('test1.txt')
plt.plot(data[:,0],data[:,1])
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果和上面的图一样 综上,使用numpy是最方便的;当然刚开始的程序有点儿复杂,但对于理解python画图的实现过程是有帮助的。 另外,numpy.loadtxt还可以读取.dat等文件,如读取CMB上的功率谱
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126338.html原文链接:https://javaforall.cn