目录
一、编码历程
二、文件操作
#1.绝对路径和相对路径
#2. 建立文件对象(打开文件、句柄)
#3. 常用函数(python3)
#4. 实例
###4.1 模仿linux下命令行的进度条(flush()函数)
###4.2 使用print()函数写入文件
###4.3 在一个文本文件的第三行追加一个字符串
#5. with关键字
一、编码历程
二进制
过渡到–>ASCII码:智能存英文和拉丁字符。一个字符占一个字节,8位
在中国的发展:
---------->gb2312:1980年,只能存6700多个中文
-------------->gbk1.0存2万多字符,1995
----------------->gb18030:2000,27000中文
在国际上的发展:万国码
----->unicode:utf-32,一个字符占4个字节
----->unicode:utf-16,一个字符占两个字节或者两个以上,
----->unicode:utf-8,英文用ASCII码存,一个中文占3个字节,
在python2中:
默认编码:ASCII码
在python3中:
默认编码:unicode
二、文件操作
1. 绝对路径和相对路径
2. 建立文件对象(打开文件、句柄)
使用open()函数打开文件。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:
模式 | 描述 |
---|---|
t | 文本模式(默认) |
x | 写模式,新建一个文件,如果该文件已存在,则会报错 |
b | 二进制模式 |
+ | 打开一个文件进行更新 |
r | 以制度方式打开文件。文件的指针将会放在文件开头,这是默认模式 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头,这是默认模式。一般用于读取二进制文件,如图片。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 用只读模式打开文件。如果该文件已存在则会覆盖原有内容。如果文件不存在,则创建文件 |
wb | 以二进制格式打开一个文件只写入。如果文件已存在则会覆盖原有内容。如果文件不存在,则创建文件 |
wb+ | 以二进制格式打开一个文件用于读写。如果文件已存在则会覆盖原有内容。如果文件不存在,则创建文件 |
a | 打开一个文件进行追加,文件不存在则会创建新文件写入。 |
ab | 以二进制格式打开一个文件进行追加。文件不存在则会创建新文件进行写入。 |
a+ | 打开一个文件进行追加模式的读写。文件不存在则会创建新文件进行读写。 |
ab+ | 以二进制格式打开一个文件用于追加。文件不存在则会创建新文件进行读写。 |
3.常用函数(python3)
函数名 | 功能 |
---|---|
read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
readline([size]) | 读取整行,包括 “\n” 字符。 |
readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
tell() | 返回文件当前位置。一个汉字占3个位置(utf-8) |
truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
seek(offset[, whence]) | 移动文件读取指针到指定位置(见附加) |
flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
close() | 关闭文件。关闭后文件不能再进行读写操作。该函数会进行flush()操作 |
附加:
fileObject.seek(offset[, whence])
参数:
offset – 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;
0 代表从文件开头开始算起,
1 代表从当前位置开始算起,
2 代表从文件末尾算起。
返回值:
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
4.实例
4.1 模仿linux下命令行的进度条(flush()函数)
import sys,time
for i in range(30):
sys.stdout.write('*')
sys.stdout.flush()
time.sleep(0.2)
'''
输出结果:
每隔0.2秒在屏幕上打印一个*,一共打印30个,最终在屏幕上显示30个*
'''
4.2 使用print()函数写入文件
f = open('小重山.txt', 'w',encoding='utf-8')
for i in range(30):
print('zzh',file=f,flush=True)
f.close()
4.3 在一个文本文件的第三行追加一个字符串
f = open('小重山.txt', 'r+',encoding='utf-8')
number = 0
while True:
line = f.readline()
print(f.tell())
number+=1
if number == 2:#此时读取到第二行,则指针移动到了第二行尾部,故接下来的操作是对第三行进行的
index = f.tell()#记录此时的指针位置
line = f.readline()#读取第三行内容
lines = f.read()#读取第三行以后的内容
line = ''.join([line.strip(),'走四方\n'])#在第三行追加内容
line = ''.join([line,lines])#将处理后的第三行内容与原来的第三行以后的内容链接
f.seek(index)#将指针移动到第二行尾部
f.write(line)#写入处理后的内容
f.flush()#刷新缓冲区
break
f.close()
注1:在实现这个功能的时候犯了一次傻,,在定位到第三行之后,当时尝试直接只修改第三行,处理之后写入到文件,第四行的内容也改变了。应该是因为文件内容在磁盘上存储在一段连续的区域中,所以只对第三行进行修改而不去读取其他的内容是行不通的。
注2:该功能的实现可以新建一个新文件,结合注3将内容进行处理再写入到新文件。
注3:在读取大文件的时候,为避免造成不必要的内存占用,在读取文件的时候应该采取这样的方式。for循环中会建立迭代器
f = open('小重山.txt', 'w',encoding='utf-8')
for i in range(30):#内部建立迭代器,每次只读取一行到内存中
print('zzh',file=f,flush=True)
f.close()
5. with关键字
with是python2.5以后有的,它实质是一个控制流语句,with可以用来简化try…finally语句,它的主要用法是实现一个类_enter_()和_exit_()方法。
详情参见:https://www.jb51.net/article/92387.htm
以下内容摘自:https://blog.youkuaiyun.com/lu13093323120/article/details/82195060
对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。
如何正确的关闭一个文件呢?
a. 普通版
f = open("1.txt", "w")
f.write("0000")
f.close()
b. 进阶版
f = open("1.txt", "w")
try:
f.write("111111")
except Exception:
print("ERROR")
finally:
f.close()
c. 高级版
with open("1.txt", "w") as f:
f.write("2222")