编码与文件读写

1. 编码

编码的本质就是让只认识0和1的计算机,能够理解我们人类使用的语言符号,并且将数据转换为二进制进行存储和传输。这种从人类语言到计算机语言转换的形式,就叫做编码表,它让人类语言和计算机语言能够一一对应起来。要了解编码,我们还得先来聊聊二进制。由于有二进制,0和1这两个数字才能像“太极生两仪,两仪生四象,四象生八卦”一样,涵盖容纳世间所有的信息。

1.1 二进制

1 byte = 8 bit,也就是1字节等于8比特。

1.2 编码表

编码表:计算机世界的字典
简单的编码史
第0,计算机是有自己的工作区的,这个工作区被称为“内存”。数据在内存当中处理时,使用的格式是Unicode,统一标准。在Python3当中,程序处理我们输入的字符串,是默认使用Unicode编码的,所以你什么语言都可以输入。
第1,数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经“默默地”帮我们做好了编码工作。
第2,一些中文的文件和中文网站,还在使用GBK,和GB2312。
基于此,有时候面对不同编码的数据,我们要进行一些操作来实现转换。这里涉及接下来要讲的【encode】(编码)【decode】(解码)的用法。

1.3 encode()和decode()

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()
在这里插入图片描述

print('吴枫'.encode('utf-8'))
print('吴枫'.encode('gbk'))
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8'))
print(b'\xce\xe2\xb7\xe3'.decode('gbk'))
>>>
b'\xe5\x90\xb4\xe6\x9e\xab'
b'\xce\xe2\xb7\xe3'
吴枫
吴枫

将人类语言编码后得到的结果,有一个相同之处,就是最前面都有一个字母b,比如b’\xce\xe2\xb7\xe3’,这代表它是bytes(字节)类型的数据。\x是分隔符,用来分隔一个字节和另一个字节。

print(type('吴枫'))
print(type(b'\xce\xe2\xb7\xe3'))
>>>
<class 'str'>
<class 'bytes'>

所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据。

\xe5\x90\xb4\xe6\x9e\xab  # Python编码“吴枫”的结果
%E5%90%B4%E6%9E%AB # 网址里的“吴枫”

网址里面有好多的%,它们也是分隔符,替换了Python中的\x。
此外,用decode()解码的时候则要注意,UTF-8编码的字节就一定要用UTF-8的规则解码,其他编码同理,否则就会出现乱码或者报错的情况.

print('K'.encode('ASCII'))
>>>
b'K'

这里看到大写字母K被编码后还是K,但这两个K对计算机来说意义是不同的。前者是字符串,采用系统默认的Unicode编码,占两个字节。后者则是bytes类型的数据,只占一个字节。这也验证我们前面所说的编码就是将str类型转换成bytes类型。

2. 文件读写

文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本记录、音频片段、Excel文档、保存邮件以及任何保存在电脑上的东西。

2.1 读取文件

在这里插入图片描述
【第1步-开】使用open()函数打开文件。语法是这样的:

file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8') 

open()函数里面有三个参数,对吧:

'/Users/Ted/Desktop/test/abc.txt'
'r'
encoding='utf-8'

第一个参数是文件的保存地址,一定要写清楚,否则计算机找不到。

文件的地址有两种:相对路径绝对路径,拖到终端获取的地址是绝对路径。
绝对路径就是最完整的路径,相对路径指的就是【相对于当前文件夹】的路径,也就是你编写的这个py文件所放的文件夹路径!如果你要打开的文件和open.py(python编写的文件)在同一个文件夹里,这时只要使用相对路径就行了,而要使用其他文件夹的文件则需使用绝对路径。
Windows系统里,常用\来表示绝对路径,/来表示相对路径,所以当你把文件拖入终端的时候,绝对路径就变成:

C:\Users\Ted\Desktop\test\abc.txt

但是呢,\在Python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成以下两种格式;

open('C:\\Users\\Ted\\Desktop\\test\\abc.txt') #将'\'替换成'\\'

open(r'C:\Users\Ted\Desktop\test\abc.txt')     #在路径前加上字母r

获取文件的相对路径还有个小窍门,用VS Code打开文件夹,在文件点击右键,选择:
在这里插入图片描述
**第二个参数表示打开文件时的模式。**这里是字符串 ‘r’,表示 read,表示我们以读的模式打开了这个文件。
第三个参数encoding=‘utf-8’,表示的是返回的数据采用何种编码,一般采用utf-8或者gbk。
**【第2步-读】。**打开文件file1之后,就可以用read()函数进行读取的操作了。请看代码:

file1 = open('/Users/Ted/Desktop/test/abc.txt', 'r',encoding='utf-8') 
filecontent = file1.read()  

写法是变量file1后面加个.句点,再加个read(),并且把读到的内容放在变量filecontent里面,这样我们才能拿到文件的内容。
现在我们想要看看读到了什么数据,可以用print()函数看看。

file1 = open(r'C:\Users\white\Desktop\test\abc.txt','r',encoding='utf-8') #第一步,打开文件,这里有三个参数
#第一个参数是文件的保存地址;第二个参数是读,第三个参数是编码
filecontent = file1.read()
print (filecontent) 
>>>
周芷若
赵敏 

【第3步-关】关闭文件,使用的是close()函数。

file1 = open(r'C:\Users\white\Desktop\test\abc.txt','r',encoding='utf-8') #第一步,打开文件,这里有三个参数
#第一个参数是文件的保存地址;第二个参数是读,第三个参数是编码
filecontent = file1.read()
print (filecontent) 
file1.close()  #注意close后面的()不能丢

为啥要关闭文件呢?原因有两个:
1.计算机能够打开的文件数量是有限制的,open()过多而不close()的话,就不能再打开文件了。
2.能保证写入的内容已经在文件里被保存好了。
文件关闭之后就不能再对这个文件进行读写了。如果还需要读写这个文件的话,就要再次 open() 打开这个文件。
在这里插入图片描述

2.2 写入文件

在这里插入图片描述
【第1步-开】以写入的模式打开文件。
open() 中还是三个参数,其他都一样,除了要把第二个参数改成’w’,表示write,即以写入的模式打开文件。
【第2步-写】往文件中写入内容,使用write()函数。

file1 = open('abc.txt','w',encoding='utf-8') 
file1.write ('张无忌\n')   #暴力写入,原文件的内容会被覆盖掉
file1.write ('宋青书\n')
>>>
张无忌
宋青书

'w’写入模式会给你暴力清空掉文件,然后再给你写入。如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用’a’模式,表示append,你学过,它是追加的意思。

file1 = open('abc.txt','a',encoding='utf-8')  #a,表示append以追加的方式打开文件abc.txt
file1.write ('阿修罗\n')   
file1.write ('孙悟空\n')
>>>
张无忌
宋青书
阿修罗
孙悟空

最后加上关闭文件的代码,就是完整的写文件了:

file1 = open('abc.txt','a',encoding='utf-8')  #a,表示append以追加的方式打开文件abc.txt
file1.write ('阿修罗\n')   
file1.write ('孙悟空\n')
file1.close()

注意:

1.write()函数写入文本文件的也是字符串类型。
2.在’w’和’a’模式下,如果你打开的文件不存在,那么open()函数会自动帮你创建一个

小练习1:

file1 = open(r'C:\Users\white\Desktop\test1\1.txt','w',encoding='utf-8')
file1.write('难念的经')
file1.close()
file1 = open(r'C:\Users\white\Desktop\test1\1.txt','r',encoding='utf-8')
content = file1.read()
print(content)
file1.close()
>>>
难念的经

如果我们想写入的数据不是文本内容,而是音频和图片的话:
在这里插入图片描述
我们可以看到里面有’wb’的模式,它的意思是以二进制的方式打开一个文件用于写入。因为图片和音频是以二进制的形式保存的,所以使用wb模式就好了。

补充:为了避免打开文件后忘记关闭,占用资源或当不能确定关闭文件的恰当时机的时候,我们可以用到关键字with

# 普通写法
file1 = open('abc.txt','a') 
file1.write('张无忌') 
file1.close()

# 使用with关键字的写法
with open('abc.txt','a') as file1:
#with open('文件地址','读写模式') as 变量名:
    #格式:冒号不能丢
    file1.write('张无忌') 
    #格式:对文件的操作要缩进
    #格式:无需用close()关闭

小练习2

split()是把字符串分割的,而还有一个join()函数,是把字符串合并的。

a=['c','a','t']
b=''
print(b.join(a))
c='-'
print(c.join(a))
>>>
cat
c-a-t

join()的用法是str.join(sequence),str代表在这些字符串之中,你要用什么字符串连接,在这里两个例子,一个是空字符串,一个是横杠,sequence代表数据序列,在这里是列表a。
下面的小练习需要好好研究

file1 = open(r'c:\Users\white\Desktop\test1\scores.txt','r',encoding='utf-8')
readlines = file1.readlines()   #readline()函数,可以按照每一行来读取文件,读出的文件存放在列表中
file1.close()
#print(readlines)

final_score = []     #新建一个空列表,为后面存储总分和成绩

for i in readlines:
    #print(i)
    data = i.split()     #split()函数,可以把字符串分开,它会按空格把字符串里面的内容分开。对应有个join()函数,合并字符串
    #print(data)
    sum = 0
    for source in data[1:]:
        sum = sum + int(source)
    result = data[0] + str(sum)
    #print(result)
    final_score.append(result)  #每统计一个学生的总分,就把姓名和总分写入空列表

winner = open(r'c:\Users\white\Desktop\test1\winner.txt','w',encoding='utf-8')
#打开一个叫winner.txt的文件。(如果电脑中不存在winner.txt的话,这行代码会帮你自动新建一个空白的winner.txt)
winner.writelines(final_score)
#writelines()的方式写进去,为什么不能用write()?
#因为final_scores是一个列表,而write()的参数必须是一个字符串,而writelines()可以是序列,所以我们使用writelines()。
winner.close()
>>>
winner.text显示:
罗恩102哈利383赫敏561马尔福275
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值