PYTHON学习笔记(十)-- 文件操作

1.文件读写

文件读写步骤:

  • 打开文件
  • 读写文件
  • 保存文件
  • 关闭文件

打开文件:

open(‘文件名称’,‘打开方式’)

文件打开方式:
PYTHON学习笔记(十)-- 文件操作_第1张图片

#文件的操作

#打开文件 open
#默认的编码是gbk,也就是中文编码
#也可以在打开文件时给它指定一个编码类型
#w模式会在文件已存在的情况下,会将文件原来的内容覆盖

fobj = open('./Test.txt','w',encoding='utf-8')

#读/写文件

#写文件
fobj.write('写入信息')

#close()相当于保存加关闭,关闭之前会自动保存
fobj.close()

#以二进制的形式去写数据
#效果其实差不多,只不过是写入模式的不同
fobj = open('Test.txt_!','wb')
fobj.write('二进制写入数据'.encode('utf-8'))
fobj.close()

#a模式是追加数据,不会将原来文件内容覆盖,如果文件不存在也会创建
#ab模式则是以二进制形式来追加,原理和a模式一样
fobj = open('Test.txt_!','a')
fobj.write('追加的数据不会覆盖\r\n')
#如果转成utf-8编码的话会将字符串变成字节
#而a模式下只可以输入字符串,所以不可以转码
fobj.close()

#读文件

#1.打开文件
#f = open('Test.txt','r')#r--只读形式打开
f = open('Test.txt','rb')#rb--以二进制的形式读取数据

#2.文件操作
print(f.read())#读取所有的数据
print(f.read(3))#定义读几个数据,如3个数据
print(f.readline())#读一行数据
print(f.readlines())
#readlines()  按行读取,
# 一次性读取所有内容,返回一个列表,每一行内容作为一个元素
#如果读取了二进制的数据,可以通过解码的方式转换为指定的格式
#print(f.decode('gbk'))

#3.将文件对象关闭
f.close()

#with上下文管理
#with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后已经关闭打开的文件句柄
#也就是自动加close()
with open('Test.txt','r') as f:
    print(f.read())

小结:
文件读写的几种操作方式:
read— r,r+,rb,rb+
r , r+ – 只读 – 适用于普通的读取场景
rb , rb+ 适用于 文件 图片 视频 音频 这样的文件读取

write — w w+ wb wb+ a ab
w wb+ w+ – 每次都会去创建文件
(二进制读写时,要注意编码问题,默认情况下,写入文件的编码时gbk)
a ab a+ – 在原有的文件的基础之后去文件指针的末尾去追加

文件操作–文件备份例子:

#文件的备份
def copyFile():
    #接受用户输入的文件名
    old_file = input('请输入要备份的文件名')
    #因为要获取对应的文件名和文件的格式,所以要用“.”分割数据,存入列表
    file_list = old_file.split('.')
    #构造新的文件名.加上备份的后缀
    new_file = file_list[0]+'_备份.'+file_list[1]
    #转移数据
    old_f = open(old_file,'r')#打开需要备份的文件
    new_f = open(new_file,'w')#以写模式去打开新文件,不存在则创建
    content = old_f.read()#将文件内容读取出来
    new_f.write(content)#将读取的内容写入到备份文件
    old_f.close()
    new_f.close()
    pass

copyFile()

#如果处理超大文件,依次将全部内容读取出来显然是不合适的,因此要优化一下
def copyBigFile():
    #接受用户输入的文件名
    old_file = input('请输入要备份的文件名')
    #因为要获取对应的文件名和文件的格式,所以要用“.”分割数据,存入列表
    file_list = old_file.split('.')
    #构造新的文件名.加上备份的后缀
    new_file = file_list[0]+'_备份.'+file_list[1]

    #使用for循环,逐渐读取文件
    # 使用try catch处理错误的逻辑
    try:
        with open(old_file,'r') as old_f,open(new_file,'w')as new_f:
            while True:
                content = old_f.read(1024)#一次读取1024个字符
                new_f.write(content)
                #循环出口
                if len(content)<1024:
                    break
    except Exception as msg:
        print(msg)
    pass

2.文件定位

#1.tell()--返回指针当前所在的位置
with open('Test.txt','r') as f:
   print(f.read(3))
   print(f.tell())#6--每一个汉字两字节,所以当前位置为6
   print(f.read(2))
   print(f.tell())#每次读取时,文件指针随着上次位置继续走

#2.truncate -- 可以对源文件进行截取操作,截取后原文件内容也会相应发生变化
fobjB = open('Test.txt','r')
print(fobjB.read())#鍐欏叆淇℃伅
fobjB.close()
print('截取之后的数据。。。。')

fobjA = open('Test.txt','r+')
fobjA.truncate(4)
print(fobjA.read())
fobjA.close()#鍐欏

#3.seek() -- 可以将文件指针定位在其他位置在进行相应操作
#seek(offset,from)有两个参数,offset,偏移量单位字节,负数为往回偏移,正数是向前便宜
#from位置:0表示文件开头,1表示当前位置,2表示文件末尾
#如 f.seek(-2,1)#相当于光标从当前位置往回走两个位置
with open('Test.txt','rb') as f:
    data = f.read(2)#鍐
    print(data.decode('gbk'))#二进制读取后要解码为中字
    f.seek(-2,1)#相当于返回了原点位置
    print(f.read(2).decode('gbk'))#鍐
#注:如果只用'r'的方式读取文件,没有使用二进制的选项打开,只能从文件的头部开始读取

你可能感兴趣的:(python学习笔记,python)