-
引子
-
文件处理
-
什么是文件?为何要用文件?如何用文件?
-
字符编码应用
-
bytes类型
-
文件操作方法
-
控制文件指针移动
-
文件的修改
-
文件处理
-
1、什么是文件
文件是操作系统提供给用户或者应用程序操作硬盘的一种机制
-
2、为何要用文件
读写文件--------->存取硬盘
应用程序:open()
操作系统:打开文件
计算机硬件: 硬盘空间
-
3、如何用文件
打开文件:得到文件句柄并赋值给一个变量
读/写:通过句柄对文件进行操作
关闭文件
r"D:acd.txt" # 绝对路径:从头开始的文件夹路径 代表路径分隔符,加r是取消的特殊意义
r"aa.txt" # 相对路径:相对当前运行程序所在的文件夹路径
# 回车与换行的来龙去脉
http://www.cnblogs.com/linhaifeng/articles/8477592.html
# 打开文件,得到文件句柄并赋值给一个变量
f = open(r"aa.txt",mode="rt",) # open是指定你要打开文件的路径
# f的值-》文件句柄,文件对象
# 通过句柄对文件进行操作
res = f.read()
print(res,type(res))
# 关闭文件
f.close() # 回收操作系统的资源
print(f)
f.read() # f.read只适用于比较小的文件
# with上下文管理(帮你关文件)
with open(r"aa.txt",mode="rt",) as f,
open(r"a.txt",mode="rt",) as f1: # ,转义换行符,其实这是一行
res = f.read()
with open(r"aa.txt",mode="rt",) as f:
for line in f:
print(line) # line末尾其实是有一个换行符的
with open(r"aa.txt",mode="rt",) as f:
res=line.strip('
').split(':') # 去掉换行符
print(res)
-
字符编码应用
英文字符--------------》内存:ASCII格式的二进制--------------》硬盘:ASCII格式的二进制
中文字符、英文字符--------------》内存:gbk格式的二进制----------------》硬盘:gbk格式的二进制
日文字符、英文字符--------------》内存:shif-jis格式的二进制-----------》硬盘:shif-jis格式的二进制
编码 编码
万国字符---------------》内存:unicode格式的二进制-----------》硬盘:utf-8格式的二进制
中文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:gbk格式的二进制
日文字符、英文字符---------------》内存:unicode格式的二进制-----------》硬盘:shift-jis格式的二进制
-
如何保证不乱码:
存乱了
用utf-8编码存入硬盘
读乱了
将读的编码改成与存的编码一致
运行python程序的三个步骤:python test.py
1、启动python解释器
2、解释器将test.py的内容从硬盘读入内存
3、解释器解释执行刚刚读入内存的代码,识别python语法,比如x = "上"
# coding:gbk # 在python程序的第一行,必须是在第一行。此行代码就是告诉python解释器在运行
# 程序的时候不要再使用默认的字符编码表,要使用gbk
-
bytes类型
# 细节:以后写python程序,字符串前面要加小u,涉及这个程序在python2的程序中也能运行,
# python3不需要加,它的本质就是unicode
# 编码 编码
# 字符-------------------->unicode------------->其他编码
# 解码 解码
# 字符<--------------------unicode<-------------其他编码
x = "上"
# x.encode 编码
print(x)
res = x.encode("gbk")
print(type(res)) # res是gbk格式的字符编码
# 强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换成字符
# x.decode 解码
print(res)
print(res.decode("gbk"))
-
文件操作方法
-
控制文件读写操作的模式
r:只读模式 (默认模式,文件必须存在,不存在则抛出异常)
w:只写模式 (不可读;不存在则创建;存在则清空内容)
a:只追加写模式 (不可读;不存在则创建;存在则只追加内容)
-
制文件读写内容的模式:
t:控制读写的内容都是字符串类型(默认的)
特点:
1、只适用于文本文件
2、一定要指定encoding参数
b:控制读写的内存都是bytes类型
1、写入时也需要提供字节类型
2、一定不要指定encoding参数*
# r: 如果文件不存在则报错,文件存在则将文件指针跳到整个文件的开头
f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close()
# w: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件开头
f = open(r'b.txt',mode='wt',encoding='utf-8')
f.write("你好啊1
")
f.write("你好啊2
") # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3
")
f.close()
# a: 如果文件不存在则创建空文档,如果文件存在则清空,文件指针跳到文件末尾
f = open(r'c.txt',mode='at',encoding='utf-8')
f.write("你好啊1
")
f.write("你好啊2
") # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3
")
f.close()
# 读写模式
"+" # 表示可以同时读写某个文件
r+t # 读写(可读,可写)
w+t # 写读(可读,可写)
a+t # 写读(可读,可写)
x # 只写模式(不可读;不存在则创建,存在则报错)
x+ # 写读(可读,可写)
# 例如
f = open(r'c.txt',mode='r+t',encoding='utf-8')
# print(f.readable())
# print(f.writable())
# print(f.read())
f.write("h")
f.close()
# b模式:对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
with open('c.txt',mode='rb') as f:
res = f.read()
# print(type(res))
# print(res)
print(res.decode('utf-8'))
with open('1.mp4',mode='rb') as f:
print(f.read())
for line in f:
print(line)
with open('1.mp4',mode='rb') as src_f,open(r'D:111111.mp4',mode='wb') as dst_f:
for line in src_f:
dst_f.write(line)
with open('d.txt',mode='wb') as f:
msg = "你好"
f.write(msg.encode('utf-8'))
-
操作文件方法:
# 掌握
f.read() # 读取所有内容,光标移动到文件末尾
f.readline() # 读取一行内容,光标移动到第二行首部
f.readlines() # 读取每一行内容,存放于列表中
f.write('1111
222
') # 针对文本模式的写,需要自己写换行符
f.write('1111
222
'.encode('utf-8')) # 针对b模式的写,需要自己写换行符
f.writelines(['333
','444
']) # 文件模式
f.writelines([bytes('333
',encoding='utf-8'),'444
'.encode('utf-8')]) # b模式
# 了解
f.readable() # 文件是否可读
f.writable() # 文件是否可读
f.closed # 文件是否关闭
f.encoding # 如果文件打开模式为b,则没有该属性
f.flush() # 立刻将文件内容从内存刷到硬盘
f.name
# 文件操作的其它方法:
with open('a.txt',mode='rt',encoding='utf-8') as f:
res = f.read()
print(res) # 读所有行的内容
print('=========================')
res = f.read()
print(res)
print(f.readline()) # 可以一次读一行
res = f.readlines() # 读每一行内容,存放于列表中
print(res)
pass
with open('a.txt',mode='wt',encoding='utf-8') as f:
f.write("1111
222
333
") # 针对文本模式的写,需要自己写换行符
lines = ['aaa
',"bbbb
","cccc
"]
for line in lines:
f.write(line) # 针对b模式的写,需要自己写换行符
f.writelines(lines) # 跟f.write(line)看似一样,但底层原理不同
f.writelines("hello") # for循环写入的,hello写了五次
with open('a.txt',mode='wt',encoding='utf-8') as f:
f.write("hello")
f.flush() # 催促硬盘输入,其实是降低效率
print(f.closed)
print(f.name)
print(f.closed)
-
控制文件指针移动
-
1、被动控制文件指针移动
只有t模式下的read(n)的n代表的是字符个数,除此以外都是字节个数
with open('a.txt',mode='rt',encoding='utf-8') as f:
res = f.read(6)
print(res)
with open('a.txt',mode='rb') as f:
res = f.read(8)
print(res.decode('utf-8'))
with open('a.txt',mode='at',encoding='utf-8') as f:
f.truncate(6)
-
2、主动控制指针移动
f.seek(移动的字节个数,模式)
模式有三种:
0:永远参照文件开头
1:参照当前所在的位置
2:永远参照文件末尾
注意:只有0模式可以在t下使用,1和2只能在b模式下使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0)
f.seek(5,0)
print(f.tell())
with open('a.txt',mode='rb') as f:
f.seek(3,1)
f.seek(5,1)
print(f.tell())
res=f.read()
print(res.decode('utf-8'))
with open('a.txt',mode='rb') as f:
f.seek(-3,2)
print(f.tell())
f.seek(0,2)
-
文件的修改
-
修改文件的方式一:
1、先将文件内容全部读入内存
2、在内存中完成修改
3、将修改后的内容覆盖回原文件
ps: 耗费内存不耗费硬盘
with open('e.txt', mode="rt", encoding='utf-8') as f:
data = f.read()
with open('e.txt',mode='wt',encoding='utf-8') as f1:
f1.write(data.replace('egon','EGON'))
-
修改文件的方式二:
1、以读的方式打开原文件,然后以写的方式打开一个临时文件
2、读原文件的一行内容到内存,然后在内存中修改完毕后再写入临时文件,循环往复直到全部改完
3、删出原文件,将临时文件重命名为原文件名
ps: 耗费硬盘不耗费内存
import os
with open('e.txt',mode='rt',encoding='utf-8') as src_f,open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
for line in src_f:
dst_f.write(line.replace('EGON','egon'))
os.remove('e.txt')
os.rename('.e.txt.swp','e.txt')