python读取txt⽂件并画图1,使⽤python读取txt⽂件
已知txt⽂件内容如下:
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为轴画图
实现如下:
import matplotlib.pyplot as plt
filename = ''
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的结果是:
['\t0\t0\n', '\t1\t1\n', '\t2\t4\n', '\t3\t9\n', '\t4\t16\n', '\t5\t25\n', '\t6\t36']
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()函数,如下:
>>> type(lines[0])
<class 'str'>
>>> type(lines)
<class 'list'>
python怎么读取桌面上的文件>>> 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如下:
[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)优化代码
上⾯的代码有些繁琐(但却是很中规中矩的),可以采⽤⽅法以下优化
代码如下:
1
2
3
4
5
6
7
还可以进⼀步优化(列表解析法list conprehension)
1
2
3
4
56
X, Y = [], []
for line in open('', 'r'):
values = [float(s) for s in line.split()]
X.append(values[0])
Y.append(values[1])
plt.plot(X, Y)plt.show()
import matplotlib.pyplot as plt
with open('', 'r') as f:
X, Y = zip(*[[float(s) for s in line.split()] for line in f])
plt.plot(X, Y)
plt.show()
这种⽅法的好处是,如果有很多列,可以直接在赋值号左边加值,如X,Y,Z,W =….
解释:以上调⽤了zip函数,zip函数的⽤法可以参考
3,使⽤numpy
代码如下:
import matplotlib.pyplot as plt
import numpy as np
data = np.loadtxt('')
plt.plot(data[:,0],data[:,1])
plt.show()
1
2
3
4
5
6
7
8
结果和上⾯的图⼀样
综上,使⽤numpy是最⽅便的;当然刚开始的程序有点⼉复杂,但对于理解python画图的实现过程是有帮助的。 另外,numpy.loadtxt还可以读取.dat等⽂件,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论