文件操作
文件的读写操作
"""
语法:
fp = open(文件,模式,编码集)
fp => 文件的io对象 (文件句柄)
i => input 输入
o => outpur 输出
fp.read() 读取文件内容
fp.write() 写入文件的内容
"""
fp = open ( "ceshi1.txt" , mode= "w" , encoding= "utf-8" )
fp. write( "把大象怼进去" )
fp. close( )
fp = open ( "ceshi1.txt" , mode= "r" , encoding= "utf-8" )
res = fp. read( )
fp. close( )
print ( res)
文件存储二进制字节流
"""
二进制字节流:`用于传输数据或者存储数据的一种数据格式
b"abc" b开头的字节流要求数据只能是ascii编码中的字符,不能是中文
# 将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
#encode() 编码 将字符串转化为字节流(Bytes流)
#decode() 解码 将Bytes流转化为字符串
"""
data = b"abc"
data = "中文" . encode( "utf-8" )
print ( data, type ( data) )
res = data. decode( "utf-8" )
print ( res, type ( res) )
data = "中文" . encode( "utf-8" )
print ( len ( data) )
res = b"\xe4\xb8\xad" . decode( )
print ( res)
"""如果存储的是二进制字节流,指定模式wb,不要指定encoding编码集,如指定会报错"""
fp = open ( "ceshi2.txt" , mode= "wb" )
strvar = "红鲤鱼绿鲤鱼与驴" . encode( "utf-8" )
fp. write( strvar)
fp. close( )
fp = open ( "ceshi2.txt" , mode= "rb" )
res = fp. read( )
fp. close( )
print ( res)
print ( res. decode( ) )
文件的复制
"""所有的图片,音频,视频都需要通过二进制字节流来进行存储传输."""
fp = open ( r"D:\python32_python\day01\集合.png" , mode= "rb" )
res = fp. read( )
fp. close( )
print ( len ( res) )
fp = open ( "集合2.png" , mode= "wb" )
fp. write( res)
fp. close( )
文件操作的扩展模式
w write 写入模式
文件不存在则创建文件, 存在的话则打开清空内容, 并且将文件指针放在文件的开头
r read 读取模式
文件不存在则报错! 存在的话则打开文件,并且将文件指针放在文件的开头
a append 追加模式
文件不存在则创建文件, 存在的话则打开文件, * 并且将文件指针放在文件的末尾*
x xor 异或模式 ( 了解,基本不使用)
文件已存在则报错! 不存在的话则创建文件, 将文件指针放在文件的开头
+ plus 增强模式( 可以让文件具有读写功能)
b bytes bytes 模式( 二进制字节流)
w, w+ , wb, wb+
r, r+ , rb, rb+
a, a+ , ab, ab+
x, x+ , xb, xb+
文件光标的方法
"""
# (utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
#read() 功能: 读取字符的个数(里面的参数代表字符个数)
注意:从当前光标往右边读
#seek() 功能: 调整指针的位置(里面的参数代表字节个数)
seek(0) 把光标移动到文件的开头
seek(0,2) 把光标移动到文件的末尾
#tell() 功能: 当前光标左侧所有的字节数(返回字节数)
"""
1. r+ 先读后写
fp = open ( "ceshi3.txt" , mode= "r+" , encoding= "utf-8" )
res = fp. read( )
fp. write( "ab" )
fp. seek( 0 )
print ( fp. read( ) )
fp. close( )
2. r+ 先写后读
fp = open ( "ceshi3.txt" , mode= "r+" , encoding= "utf-8" )
fp. seek( 0 , 2 )
fp. write( "cd" )
fp. seek( 0 )
res = fp. read( )
print ( res)
fp. close( )
3. w+ 可读可写,清空重写(默认可以创建新的文件)
fp = open ( "ceshi4.txt" , mode= "w+" , encoding= "utf-8" )
fp. write( "abc" )
fp. seek( 0 )
print ( fp. read( ) )
fp. close( )
4. a+ 可读可写,追加写入 (默认可以创建新的文件)
fp = open ( "ceshi5.txt" , mode= "a+" , encoding= "utf-8" )
fp. write( "def" )
fp. seek( 0 )
print ( fp. read( ) )
fp. close( )
5. r+和a+区别
"""
r+模式基于当前光标所在位置进行写入覆盖
a+模式会强制把光标放到文件末尾进行追加写入
"""
fp = open ( "ceshi5.txt" , mode= "a+" , encoding= "utf-8" )
fp. seek( 3 )
print ( fp. read( ) )
fp. close( )
6. seek,tell,read
的使用
fp = open ( "ceshi5.txt" , mode= "r+" , encoding= "utf-8" )
fp. seek( 4 )
res = fp. tell( )
print ( res)
fp. read( 2 )
print ( fp. tell( ) )
fp. close( )
7. 注意点 (seek在移动时,又可能移动到某个汉字的字节中间,导致原字节无法解析)
fp = open ( "ceshi6.txt" , mode= "r+" , encoding= "utf-8" )
fp. seek( 3 )
print ( fp. read( ) )
fp. close( )
with
语法 自动实现文件关闭操作(重要)
"""
with open("集合2.png",mode="rb") as fp:
res = fp.read()
with open("集合3.png",mode="wb") as fp:
fp.write(res)
"""
with open ( "集合3.png" , mode= "rb" ) as fp1 , open ( "集合4.png" , mode= "wb" ) as fp2 :
res = fp1. read( )
fp2. write( res)
字符编码(了解)
Byte字节
bit: 位
1B = 8b
B:字节, 1Byte = 8bit
无论何种字符集:英文和数字都是一个字节,汉字,韩文,日文等亚洲文字采用多个字节存储
GB系列编码:存储一个汉字使用2 个字节 ( 国标编码: 例如: gbk2312 )
UTF系列编码:存储一个汉字使用3 个字节( 国际通用: 例如: utf- 8 )
英文原始编码:
ASCII码 - > 最早的字符编码格式- > 仅支持英文和特定的符号
中文编码:
GB2312 : 包含5000 个常用汉字的标准
GB18030: 升级版本的标准,大概15000 个汉字
GBK : 包含所有中文汉字的编码(推荐)
BIG5 : 繁体中文编码
万国码:
unicode 包含世界上所有的文字( 无论什么字符 都按照4 个字节表示)
utf- 8 可变长的unicode 编码
刷新缓冲区
fp = open ( "ceshi1.txt" , mode= "a" , encoding= "utf-8" )
fp. write( "abc" )
fp. flush( )
while True :
pass
fp. close( )
文件相关函数
readable()
功能: 判断文件对象是否可读
writable()
功能: 判断文件对象是否可写
"""fp这个对象本身是迭代器,可以把文件中的内容按照换行,一行一行遍历出来"""
fp = open ( "ceshi1.txt" , mode= "r" , encoding= "utf-8" )
print ( fp. readable( ) )
print ( fp. writable( ) )
for i in fp:
print ( i)
1. readline()
功能: 读取一行文件内容
with open ( "ceshi1.txt" , mode= "r" , encoding= "utf-8" ) as fp:
res = fp. readline( )
print ( res)
res = fp. readline( )
print ( res)
res = fp. readline( )
print ( res)
res = fp. readline( )
print ( res)
with open ( "ceshi1.txt" , mode= "r" , encoding= "utf-8" ) as fp:
res = fp. readline( )
while res:
print ( res)
res = fp. readline( )
with open ( "ceshi1.txt" , mode= "r" , encoding= "utf-8" ) as fp:
"""
读取的字符数量 > 实际当前行字符数量的时候 => 按照当前行读取
读取的字符数量 < 实际当前行字符数量的时候 => 按照实际数量来读
"""
res = fp. readline( 300 )
print ( res)
2. readlines()
功能:将文件中的内容按照换行读取到列表当中
lst_new = [ ]
with open ( "ceshi1.txt" , mode= "r+" , encoding= "utf-8" ) as fp:
lst = fp. readlines( )
for i in lst:
lst_new. append( i. strip( ) )
print ( lst_new)
3. writelines()
功能:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据
lst = [ '床前明月光' , '疑是地上霜' , '举头望明月' , '低头想家乡' ]
with open ( "ceshi2.txt" , mode= "w+" , encoding= "utf-8" ) as fp:
fp. writelines( lst)
lst_new = [ ]
lst. insert( - 1 , "遥知不是雪" )
for i in lst:
lst_new. append( i + "\n" )
print ( lst_new)
with open ( "ceshi2.txt" , mode= "w+" , encoding= "utf-8" ) as fp:
fp. writelines( lst_new)
lst = [ 1 , 2 , 3 ]
with open ( "ceshi2.txt" , mode= "w+" , encoding= "utf-8" ) as fp:
fp. writelines( lst)
4. truncate()
功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)
with open ( "ceshi2.txt" , mode= "r+" , encoding= "utf-8" ) as fp:
fp. truncate( 3 )
总结:处理的单位
seek(字节) truncate(字节) read(字符/字节) readline(字符/字节)