字符编码及基本文件操作
字符编码和基本文件操作
字符编码
文字转换成数字就是强制转换
ASCII
ASCII:美国信息交换标准码,现今通用的单字节编码系统
计算机最小的表示单位:bit(比特)
计算机最小的存储单位:bytes(字节),8b = 1bytes
Unicode:万国语言编码
使用Unicode编码比ASCII编码需要多一倍的存储空间
UTF-8
将Unicode编码转化为utf-8编码,它把一个Unicode字符根据不同的数字大小编码成1-6个字节。
计算机字符编码工作方式
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为utf-8编码。
用记事本编辑的时候,从文件读取 的utf-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为utf-8保存到文件
- Unicode----->encode(编码)-------->gbk
- Unicode<--------decode(解码)<----------gbk
基本文件操作
文件的定义
文件:操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位
只要我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应用程序对文件的读写操作转换成集体的硬盘指令
文件的功能
内存无法永久保存数据,但凡我们想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。
Python中文件的操作
绝对路径:
- Windows系统绝对路径从盘符(C:\、D:\)开始写一个完整的路径。
- macos系统从根目录(/Users)开始写一个完整的路径。
相对路径:
- 相对于当前执行文件所在的文件夹开始找
打开文件的五种方式
1.read模式
r:只读模式,只能读不能写,文件不存在时报错。
#f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r',encoding='utf8')
#读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存
#data=print(f.read())
#print(data)
#f.close()
#由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源
2.write模式
w: 只能写,不能读,文件存在的时候回清空文件后再写入内容;文件不存在的时候会创建文件后写入内容。强行读入会删除源文件数据
#f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='w',encoding='utf8')
#f.write('qwqqf')
#f.close()
3.append模式(添加数据)
a:可以追加。文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。
若强行读入,不会删除原文件数据
#f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='a',encoding='utf8')
#f.write('qwqqf')
#f.close()
需要注意的是t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。
4.text模式(文本模式)
# with open('test', 'rt', encoding='utf8') as f:
# data = f.read()
# print(data)
5.bytes模式(字节模式)
b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式存储的,需要注意的是:b模式读写文件,一定不能加上encoding参数,因为二进制无法再编码
# with open('test', 'rb') as f:
# data = f.read()
# print(data)
with上下文管理:with open(file,mode,encoding) as f :
复制文件:
# with open('test1', 'r', encoding='utf8') as fr, \
# open('test2', 'w', encoding='utf8') as fw:
# data = fr.read()
# fw.write(data)
修改文件内容的两种方式
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说
方式一:一次性读所有
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘
import os
with open('test.txt') as fr\
open('test1.txt','w') as fw:
data = fr.read() # 全部读入内存
data = data.replace('a','b') # 在内存中完成修改
fw.write(data)
os.remove("test.txt") # 删除原文件名
os.rename("test1.txt","test.txt") # 重新命名新文件名为原文件名
print("done...")
方式二:逐行修改
import os
with open('test.txt') as fr\
open('test1.txt','w') as fw:
for line in fr: # 循环读取文件内容,逐行修改
line=line.replace('a','b') # 新文件写入原文件修改后内容
fw.write(line)
os.remove("test.txt") # 删除原文件名
os.rename("test1.txt","test.txt") # 重新命名新文件名为原文件名
print("done...")
修改文件内容的思路为:以读的方式打开原文件,以写的方式打开一个新的文件,把原文件的内容进行修改,然后写入新文件,之后利用os模块的方法,把原文件删除,重命名新文件为原文件名,达到以假乱真的目的。
了解补充:
文件光标的移动:
一: read(3):
-
文件打开方式为文本模式时,代表读取3个字符
-
文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果