python基础语法4 文件处理
1、什么是文件
操作系统提供给你操作硬盘的一个工具
2、为什么要用文件
因为人类和计算机要永久保存数据
3、怎么用文件
相对路径:a.txt # 必须与当前py文件在同一级目录
绝对路径:D:\项目路径\python13期\day07\a.txt
读文件
f=open('a.txt') print(f.readable()) #判断当前文件是否可读 True
print(f.writable()) #判断当前文件是否可写 False f.close() #回收操作系统的资源
#\可以实现换行 以下为相对路径 同时读和写操作
with open('a.txt',mode='r')as rf,\
open('a.txt',mode='w')as wf: # with会自动帮你回收操作系统的资源,无需自己操作,关闭
print(rf.readable()) #True
print(rf.writable()) #False #r进行转义 以下为绝对路径
with open(r'D:\oldboy_edu\python_code\day7\a.txt',encoding='utf-8')as f: # 不加encoding = 'utf-8'出现乱码,原因不明
print(f.read()) #读取文件
th.jpg(原素材)lixiaoran.png(生成图片)
# 默认打开文件的模式:rt read text 和r相同
# rb read bytes
with open('a.txt',mode='rb')as f: # 内容为:今天天气真好
print(f.read())
# b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\xa4\xa9\xe6\xb0\x94\xe7\x9c\x9f\xe5\xa5\xbd' #读取jpg图片为二进制,再把二进制数据写入png文件,生成新的图片
with open(r'th.jpg',mode='rb')as rf,\
open('lixiaoran.png',mode='wb')as wf:
lixiaoran = rf.read()
print(lixiaoran)
wf.write(lixiaoran)
打开文件的三种模式:
r : 1、只读 2、如果文件不存在,会报错
w:(慎用) 1、只写 2、如果文件不存在,则新建一个文件写入数据 3、如果文件内存在数据,会将数据清空,重新写入
a: 1、追加写 2、如果文件内存在数据,会在已有数据的后面追加数据 3、如果文件不存在,则新建一个文件写入数据
处理文件的模式:
t:文本模式
只能与r\w\a连用
默认情况下,是rt模式
b:bytes模式
只能与r\w\a连用
处理二进制数据
"""
文件处理的内置方法:
读:
f.read() # 读文件;一次性读出所有数据
f.readline() # 一次读一行
f.readlines() # 将数据全部读入内存,以换行符分隔,存入列表
f.readable() # 是否可读
写:
f.write # 写文件
f.writeable # 是否可写
f.writelines() # for + f.write()
for line in f:
pass
r:防止转义
with open(r'dir\b.txt','r',encoding='gbk')as f:
print(f.readable())
print(f.read()) # 读文件;一次性读出所有数据
print(f.readline()) # 执行一次,打印一行内容
print(f.readlines()) #将数据全部读入内存,以换行符分隔,存入列表
print(f.readable())
for i in f: # f为句柄,可迭代对象,会以\n为结束,一行行打印
print(i) with open('b.txt', 'w', encoding='gbk')as f:
f.write("上海校区第一帅-sean") # 写文件
f.writelines(["上午没翻车\n",'我很高兴']) # 将数据全部读入内存,以换行符分隔,存入列表
# writelines 可以写入列表,可迭代对象。类似 for + f.write() with open(r'dir\aaaaa.txt','a',encoding='gbk')as f: #追加写入
print(f.writable())
f.write("\n翻车是不可能的")
注意:在windows系统下,用open函数打开txt文档标注编码,默认为gbk。(下面方法可以显示当前编码方式)
with open(r'b.txt','r',encoding='utf-8')as f:
print(f.encoding) #显示当前编码格式
打开文件模式扩展
r,w,a #纯净模式
r+,w+,a+ # 可读可写 (除了可读·可写之外剩下都是自己的特性)
注:写完必须关了文件,才能读,否则在内存,不再硬盘
with open('abc.txt','r+',encoding='utf8')as f:
f.write('天气正好') #如果没有文件,则报错
print(f.readable())
print(f.writable())
with open('abc.txt','w+',encoding='utf8')as f:
f.write('天气不太好') #没有文件则创建
print(f.read())
print(f.readable())
print(f.writable())
with open('a.txt','a+',encoding='utf8')as f:
f.write('哦哟,天气好')
# print(f.read())
print(f.readable())
print(f.writable())
文件内光标的移动:
"""
f.seek(offset,whence)
offset: 相对偏移度 (光标移动的位数)针对的是字节
whence:指定光标位置从何开始,默认是0
0:从文件开头
1:从当前位置
2:从文件末尾
补充:
utf-8:
中文是3个bytes
英文是1个bytes
gbk:
中文是2个bytes
全角英文2bytes,半角英文是1个bytes
open函数不设置encoding,默认是gbk
与encode一毛钱都没有,encoding只是一个参数
如果rt打开文档,若whence为1,2,必须是(0,1),(0,2)!
rt模式下,除了read里面的参数是针对字符,其他都是针对字节
rb模式下,全部正对字节
"""
with open('a.txt','r',encoding='utf8')as f: #文件内容为'哦哟天气好啦啦啦'
print(f.tell()) #
print(f.read(2)) #哦哟
print(f.tell()) #
f.seek(6,0) #光标从头开始,前进6个bytes,也就是2个中文字符
print(f.tell()) #
print(f.read(1)) #读取光标后第一个字符 '天' with open('a.txt','r')as f: #不写encoding默认gbk,因为open调用的是window操作系统,默认为gbk
f.seek(4,0)
print(f.read(2).encode('utf-8')) #把内存unicode转为utf-8,2个字符也就是6个直接
b'\xe6\x91\x95\xe6\xbe\xb6' with open('a.txt','rb')as f:
print(f.read(4).decode('utf-8')) #read 读取的是字节,文件为utf-8模式,以'utf8'格式解码
f.seek(6,1)
print(f.read(3).decode('utf-8'))
f.seek(-3,2)
print(f.tell())
print(f.read(3).decode('utf-8'))
获取文件实时动态脚本
以下为获取文件实时动态脚本,优先打开进行捕获动态
import time
with open('c.txt','r',encoding='utf8')as f:
f.seek(0,2) ## 以文件末尾为参照点,移动0位
while True:
time.sleep(1)
res=f.readline() #一次读一行
if res: # 如果你读出数据了,就执行下面的代码块
print(f'录入记录:{res}')
以下为生成文件动态程序
import time
res = time.strftime('%Y-%m-%d %H:%M:%S')
with open(r'a.txt','a',encoding='utf-8')as f:
for i in range(10):
f.write(f'{res}:马上要学函数了,有点难,怎么办\n')
运行生成文件动态后,获取文件实时动态脚本自动捕获输入命令
修改文件内容:
方法1:
with open('a.txt','r',encoding='utf8')as f:
data=f.read()
print(data)
print(type(data))
with open('a.txt','w',encoding='utf8')as f:
res=data.replace('家乐福','沃尔玛')
f.write(res)
方法2:
import os
with open('b.txt','r',encoding='utf8')as rf,\
open('b_wap.txt','w',encoding='utf8')as wf:
data=rf.read()
res=data.replace('小明','小红')
wf.write(res) os.remove('b.txt')
os.rename('b_wap.txt','b.txt')
方法3:
截段 truncate(6):
with open(……)as f:
f.truncate(6) #截段6个字节
f.flush() # 将内存中数据刷到硬盘
with open(…'r'…)as rf,\
open(…'a'…)as wf:
wf.write('ab')
wf.flush() # 强制刷到硬盘
rf.read() # 不关闭可以直接读
最新文章
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
- hdu-5927 Auxiliary Set(树形dp)
- 黄聪:异步加载JS的4种方式(详解)
- 利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC
- Constructor and destructor -- Initialization &; Cleanup in C++
- UIWebView加载不了页面, 但在电脑的浏览器上可以打开
- 决策树之ID3算法实现(python)
- zTouch-移动端触屏开发利器(zepto touch扩展)
- Thinkphp入门 四 —布局、缓存、系统变量 (48)
- socket小解
- 面向对象的三大特征——封装、继承、多态(&;常用关键字)
- MyEclipse修改项目名称后,部署到tomcat问题。
- python 符合Python风格的对象
- gradle编译自定义注解(annotation)的未解决问题
- 在django admin中添加自定义视图
- jquery.validator 手机号验证
- Android7.0手机程序保活(附源码下载)
- 【Java基础】13、抽象方法不能是static或native或synchroniz 原因及误解
- 在AspNetCore 中 使用Redis实现分布式缓存 (转载)
- Git中的文件状态和使用问题解决