文件读写
编码问题
平时最烦看到的就是乱码了
在Python3当中,程序处理我们输入的字符串,是默认使用Unicode编码的,所以你什么语言都可以输入。
- 数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经“默默地”帮我们做好了编码工作。
- 一些中文的文件和中文网站,还在使用GBK,和GB2312。
基于此,有时候面对不同编码的数据,我们要进行一些操作来实现转换。这里就涉及接下来要讲的【encode】(编码)和【decode】(解码)的用法。
相关函数的用法
语法如下
a = '秋水'
print(a.encode('utf-8'))
所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据
我们再来区分下字符和字节两个概念。字符是人们使用的记号,一个抽象的符号,这些都是字符:'1', '中', 'a', '$', '¥'
而字节则是计算机中存储数据的单元,一个8位的二进制数
编码结果中除了标志性的字母b,你还会在编码结果中看到许多\x
\x是分隔符,用来分隔一个字节和另一个字节
分隔符还挺常见的,我们在上网的时候,不是会有网址嘛?你经常会看到网址里面有好多的%,它们也是分隔符,替换了Python中的\x
读取文件
感觉上各个语言的读取方式都是相差不大,大概分为三步
- 打开文件
- 读取文件
- 关闭文件
第一步,打开文件,语法如下
# open函数用来打开文件,有三个参数
#第一个参数是文件的绝对路径
#第二个参数是r,是read的简写,意思读取文件,以此方式打开的文件无写权限,只能看
#第三个参数,代码以utf-8编码的形式打开文件
file = open('C:/Windows/win.ini','r',encode('utf-8'))
打开文件之后就要进行文件的读取操作了,这个时候用到的函数是read函数,语法如下
file = open('C:/windows/win.ini','r',encode('utf-8'))
#读取打开的文件file,通过read函数
filecontent = file.read()
接下来我们把文件打印出来,并关闭文件,使用close函数
file = open('C:/windows/win.ini','r',encode('utf-8'))
filecontent = file.read()
#打印文件,并关闭
print(filecontent)
file.close()
写文件
写文件,也同样是三步
- 打开文件
- 写入文件
- 关闭文件
代码格式如下
#w代表写入文件
file = open('C:/windows/test.txt','w',encode('utf-8'))
#write函数写文件
file.write('666666666')
#关闭文件
file.close()
这里要注意,w代表写入文件,会清空源文件内容,要想,保留原内容参数需要设置成a-->append(追加)具体用法参照下图
小扩展
如果需要按行读取,这个时候就不能使用read函数了,需要使用readlines()函数
readlines() 会从txt文件取得一个列表,我们就可以使用for循环来遍历这个列表,然后处理列表中的数据
每一行的数据要想在分开可以使用split()函数,与之相对的就是join函数
小练习:
#test文件内容如下
#罗恩 23 35 44
#哈利 60 77 68 88 90
#赫敏 97 99 89 91 95 90
#马尔福 100 85 90
file1 = open('D:/test.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines:
data =i.split()
sum = 0 #先把总成绩设为0
for score in data[1:]: #遍历列表中第1个数据和之后的数据
sum = sum + int(score) #然后依次加起来,但分数是字符串,所以要转换
result = data[0]+str(sum) #结果就是学生姓名和总分
print(result)