百万年薪python之路 -- 文件操作
1.文件操作:
f = open("zcy.txt" , mode="r" , encoding="UTF-8")
open() 打开 第一个内容是文件的名字(必须是字符串)
mode 第二个内容是咱们对这个文件的操作方式 只读
encoding 第三个内容是咱们这个文件的编码集
f 文件句柄 所有对文件的操作都是操作文件句柄
打开文件的方式:
- r,w,a (重要)
- rb,wb,ab (次要)
- r+,w+,a+ (没啥用)
- r+b,w+b,a+b
默认使用的是r(只读模式)
2.r,w,a (重要)
r 操作:
read() 全部读取
read(5) 按照字符进行读取
readline() 读取每次只读取一行加"\n"
readlines() 一行一行读取,存放在列表中
f = open('周道镕.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()
结果:
周道镕是煞笔
上边的内容open()函数打开周道镕.txt的文件,然后赋值到一个句柄中,open函数中的mode是对这个文件操作是的一种模式,encoding这个是指定文件中内容的编码集,接下来的操作就完全通过句柄来操作
读取文件的方法:
read() 将文件中的内容全部读取出来;弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃
f = open('小文件.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)
结果:
章超印
周道镕
朱凡宇
杨红兴
戴军
read()读取的时候指定读取到什么位置,我们指定先读取前三个内容,然后在使用read()进行读取会继续向后读取,而不会从头开始读取
f = open('小文件.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)
结果:
章超印
周道镕
朱凡宇
杨红兴
戴军
r模式读取的是文字,如果使用rb模式读取出来的是字节
read()可以放我们读取多少内容,如果是r模式 read(3)就获取三个字,如果是rb模式 read(3)就获取三个字节
readline() 读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个\n
f = open('小文件.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
结果:
章超印
周道镕
朱凡宇
杨红兴
戴军
Process finished with exit code 0
解决读取出来的数据在后面有\n问题可以用strip()方法
f = open('小文件.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
结果:
章超印
周道镕
朱凡宇
杨红兴
戴军
readlines()读取的是每一行,存放到一个列表当中.
f = open('小文件',mode='r',encoding='utf-8')
msg1 = f.readlines()
f.close()
print(msg1)
结果:
['章超印\n', '周道镕\n', '朱凡宇\n', '杨红兴\n', '戴军']
解决大文件
如果有个较大的文件我们进行读取不推荐使用read()方法,推荐使用:
f = open('小文件',mode='r',encoding='utf-8')
for line in f:
print("-" * 20)
print(line.strip()) #这种方式就是在一行一行的进行读取,它就执行了f.readline()的功能
print("*" * 20)
f.close()
注意点:读完的文件句柄一定要关闭
w操作:
w分为二步:
1.先清空文件
2.写入文件
write() write里面只能放字符串
在写文件的时候我们要养成一个写完文件就刷新的习惯. 刷新flush()
f = open('小文件.txt',mode='w',encoding='utf-8')
f.write('周道镕')
f.flush()
f.close()
结果:
周道镕
注意点:如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空.
尝试读一读
f = open('小文件.txt',mode='w',encoding='utf-8')
f.read()
f.close()
结果:
Traceback (most recent call last):
File "H:/Python代码文件/python24期/test.py", line 1323, in <module>
f.read()
io.UnsupportedOperation: not readable #模式是w,不可以执行读操作
a操作: 追加写
在源文件的基础上进行添加
w 和 a 检测有文件就操作,没文件就创建
总结:
# r: 读文本
read() 全部读取
read(3) 看文件的操作方式 r/w/a 字符
readline 读取一行(自带换行符)
readlines() 一行一行读取存放在列表中
# w:清空,写
open("xxx","w",encoding="utf-8") # 进行清空
write() 只能写字符串
# a:追加
在文本的末尾进行写入
write()
3.rb,wb,ab(次要)
rb 操作:
f = open('周道镕',mode='rb')
content = f.read()
print(content)
f.close()
结果:
b'\xe5\x91\xa8\xe9\x81\x93\xe9\x95\x95\xe6\x98\xaf\xe7\x85\x9e\xe7\xac\x94'
rb 读出来的数据是bytes类型,在rb模式下,不能encoding字符集
rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的
wb 操作:
wb模式下,不可以指定文件中内容的编码集,但是写文件的时候必须将字符串转换成utf-8的bytes数据
write() 里面只能写字节
f = open('小文件.txt',mode='wb')
msg = '你好'.encode('utf-8')
f.write(msg)
f.flush() # 刷新
f.close()
ab操作:
ab操作: 以字节追加写
给图片追加写没有效果
write() 里面只能写字节
总结:
rb:读字节
read() 全部读取
read(3) 看文件的操作方式 rb/wb/ab 字节
readline 读取一行(自带换行符)
readlines() 一行一行读取存放在列表中
wb:清空,写
open("xxx","wb") # 进行清空
write() 只能写字节
ab:追加
open("xxx","ab")
write() 只能写字节
4.r+,w+,a+ (不常用)
r+ 操作:
对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+
一定要先读后写
f1 = open('小文件.txt',mode='r+',encoding='utf-8')
msg = f1.read()
f1.write('周道镕啊周道镕')
f1.flush()
f1.close()
print(msg)
结果:正常的读取之后,写在结尾
f1 = open('小文件.txt',mode='r+',encoding='utf-8')
f1.write('章超印')
msg = f1.read()
f1.flush()
f1.close()
print(msg)
结果:
这样写会把章超印写在开头,并且读出来的是章超印之后的内容
r+模式一定要记住是先读后写
深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行的操作.
w+操作:
写读模式
先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用
f1 = open('小文件.txt',mode='w+',encoding='utf-8')
f1.write('朱凡宇')
msg = f1.read()
f1.flush()
f1.close()
print(msg)
结果:
朱凡宇
有人说,先读在写不就行了.w+模式下 其实和w模式一样,把文件清空了,在写的内容.所以很少人用
a+ 操作:
追加写 读
f1 = open('小文件.txt',mode='w+',encoding='utf-8')
f1.write('杨红兴')
f1.flush()
msg = f1.read()
f1.close()
print(msg)
结果:
杨红兴
总结:
r+:读写
错误的方式是写读
先读后写
w+:清空写,读
1.清空文件
2.读取内容(默认读取的是空)
3.移动光标
a+:追加写,读
1.先写后读
2.读取内容(默认读取的是空)
3.移动光标
# 注意点: (a,ab,a+)将光标移动到某个位置进行,写入的时候还是在文件的末尾
5.其他操作:
seek() 移动光标
seek(n)光标移动到n位置
注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
通常我们使用seek都是移动到开头或者结尾
移动到开头:seek(0) 实际是seek(0,0)
移动到当前位置:seek(0,1)
移动到结尾:seek(0,2)
seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
seek()里边单独一个数大于0的就是按照(编码集)字节在调节光标
f = open("小文件.txt", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(">>>1",content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(">>>2",content2)
f.seek(0) # 移动到开头
f.write("章超印") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()
tell() 查看光标 -- 返回的是字节数
使用tell()可以帮我们获取当前光标在什么位置
f = open("小文件.txt", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(">>>1",content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(">>>2",content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()
truncate() 截断文件
f = open("小文件.txt", mode="w", encoding="utf-8")
f.write("123456") # 写入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后面的所有内容
f.close()
f = open("小文件.txt", mode="r+", encoding="utf-8")
content = f.read(3) # 读取3个字符
print(content)
f.seek(6)
print(f.tell())
f.truncate() # 后面的所有内容全部都删掉
f.flush()
f.close()
所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断,关于truncate(n), 如果给出了n. 则从开头移动n个位置 (相当于seek(n)) 进行截断, 如果不给n, 则从当前位置截断. 后面的内容将会被删除
with open() as f: (推荐使用这个打开文件和操作文件)
with 关键字
with open() 无需关闭(.close())
总结:
tell() 查看光标返回的是字节
seek() 移动光标
seek(0,0) 移动文件头部
seek(0,1) 当前位置
seek(0,2) 移动文件末尾
seek(3) # 按照字节进行计算 (计算方式根据编码计算)
with open("文件路径","操作模式",编码")as f:
操作文件
with open的好处:
1.可以同时打开多个文件
2.能够自动关闭文件
修改文件内容:
1.创建一个新的文件
2.将文件中的内容进行替换
3.替换后的内容写入新文件中
4.改变文件名
路径:
绝对路径: 从磁盘根部进行查找
相对路径: ../返回上一级 --推荐使用
转义:
1."C:\\user\\ner"
2. r"C:\user\ner" -- 推荐使用
6.绝对路径和相对路径
(我们更推荐大家使用相对路径,因为我把这个程序的整个文件发给你的时候,就可以运行,如果使用绝对路径还需要额外的拷贝外部文件给你)
1.绝对路径: 从磁盘根目录开始一直到文件名
2相对路径: 由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。如果在同一个文件中,则相对路劲就是这个文件名.如果再上一层文件夹则要使用../
路径转义:
1." "
2.r"C:\user\net"
7.文件名修改
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.
import os
with open("周道镕", mode="r", encoding="utf-8") as f1,\
open("章超印_new", mode="w", encoding="UTF-8") as f2:
content = f1.read()
new_content = content
f2.write(new_content)
os.remove("周道镕") # 删除源文件
os.rename("章超印_new","章超印最帅") # 重命名新文件
弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
import os
with open("周道镕", mode="r", encoding="utf-8") as f1,\
open("章超印_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line
f2.write(new_line)
os.remove("周道镕") # 删除源文件
os.rename("章超印_new","章超印最帅") # 重命名新文件
百万年薪python之路 -- 文件操作的更多相关文章
- 百万年薪python之路 -- 文件操作练习
1.有如下文件,a1.txt,里面的内容为: 老男孩是最好的学校, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并打印. with ...
- Python之路----文件操作
文件操作 1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' ...
- Python之路-文件操作(py3)
文件操作的基本步骤: 1.打开文件:f=open('filename'),with open('filename') as f 2.操作文件:增,删,改,查 3.关闭文件:f.close 打开文件 p ...
- python之路——文件操作
阅读目录 初窥文件操作基本流程 文件编码 文件的打开模式 文件内的光标移动 with上下文管理 文件的修改 练习 回到顶部 初窥文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. ...
- 百万年薪python之路 -- socket粘包问题解决
socket粘包问题解决 1. 高大上版解决粘包方式(自定制包头) 整体的流程解释 整个流程的大致解释: 我们可以把报头做成字典,字典里包含将要发送的真实数据的描述信息(大小啊之类的),然后json序 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(一)
MySQL的行(记录)的操作(一) 1. 增(insert) insert into 表名 value((字段1,字段2...); # 只能增加一行记录 insert into 表名 values(字 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
- 百万年薪python之路 -- 数据库初始
一. 数据库初始 1. 为什么要有数据库? 先来一个场景: 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...
- 百万年薪python之路 -- 并发编程之 协程
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...
随机推荐
- Spark学习之RDDs介绍
什么是RDDS? RDDS即Resilient distributed datasets(弹性分布式数据集). Spark中,所有计算都是通过RDDs的创建,转换,操作完成的. 一个RDD是一个不可改 ...
- [C++] 重载运算符与类型转换(1)
1.形式:返回值 operator符号(参数列表){} 2.不能被重载的运算符::: 作用域运算符 .* . 成员访问运算符 ?: 条件运算符:某些运算符(逗号,,取地址&, ...
- Eclipse中Spring Boot响应jsp的简单demo
首先在Eclipse里新建一个maven工程,这里的打包类型和父包如果后续再去pom中添加也可以 此时的工程路径是这样的 接下来去到pom中添加相关的依赖,如果有报错maven update一下即可 ...
- Qt 做一个类似微信滑动聊天界面的demo
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/115889 ...
- (1)安装elastic6.1.3及插件kibana,x-pack,essql,head,bigdesk,cerebro,ik
1.安装环境及程序版本 操作系统: centos6.7 jdk: 1.8.0_102 elastic: 1.6.3 kibana: 1.6.3 x-pack: 1.6.3 es-sql: 1.6.3 ...
- python2.x和python3.x版本共存时选择启动的版本
在windows环境下装好python2.7和python3.6之后,我之前一直是用了很笨的办法去区分版本 那就是把各个版本python安装目录下的python.exe分别改为python2.exe和 ...
- Andorid监听SoftKeyboard弹起事件
对于Android键盘事件Google并没有提供一个好的接口去监听它,有时候就为项目需要就必须要自己去想办法去监听,由于我最近也要实现登陆与注册的功能,我的想法很简单实现起来也比较容易,主要的原理是在 ...
- Ubuntu下安装并使用sublime text 3(建议:先安装Package controls 后在看本教程,否则可能会安装不了)
首先从Sublime Text官网下载合适的包 然后使用 tar -xvvf sublime_text_3_build_3207_x64.tar.bz2 解压: 再使用 mv sublime_text ...
- grep、正则表达式
1.grep :文本搜索工具 -i:忽略大小写--color:匹配到的内容高亮显示-v:显示没有被模式匹配到的行-o:只显示被模式匹配到的字符串-n:显示匹配到行的行号-E:使用扩展正则表达式-A:后 ...
- Linux Shell 基础知识(二)
1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...