python基础(10):文件操作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python基础(10):文件操作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7239字,纯文字阅读大概需要11分钟。
内容图文
![python基础(10):文件操作](/upload/InfoBanner/zyjiaocheng/671/d3db3d22960749cab72cf6b129017d00.jpg)
1. 初识文件操作
使?python来读写?件是非常简单的操作。我们使?open()函数来打开?个?件,获取到? 件句柄,然后通过?件句柄就可以进?各种各样的操作了,根据打开?式的不同能够执?的操 作也会有相应的差异。 打开?件的?式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使?的是r(只读)模式2. 只读操作(r,rb)
f = open("护?少妇嫩模.txt",mode="r", encoding="utf-8") content = f.read() print(content) f.close()需要注意encoding表?编码集,根据?件的实际保存编码进?获取数据,对于我们??,更 多的是utf-8. rb:读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集。
f = open("护?少妇嫩模.txt",mode="rb" ) content = f.read() print(content) f.close()rb的作?: 在读取非?本?件的时候,比如读取MP3、图像、视频等信息的时候就需要?到rb。因为这种数据是没办法直接显?出来的,在后?我们?件上传下载的时候还会?到,还有,我们看的直播,实际上都是这种数据。 绝对路径和相对路径:
结果: b'\xe6\xaf\x85\xe5\x93\xa5, \xe5\xa4\xaa\xe7\x99\xbd, wuse\n\xe5\x91\xb5\xe5\x91\xb5\n\xe6\x97\xa5\xe5\xa4\xa9'
1. 绝对路径:从磁盘根?录开始?直到?件名。 2. 相对路径:同?个?件夹下的?件,相对于当前这个程序所在的?件夹??,如果在同 ?个?件夹中,则相对路径就是这个?件名,如果在上?层?件夹,则要../。我更推荐?家使?相对路径,因为在我们把程序拷?给别?使?的时候,直接把项?拷?走 就能运?,但是如果?绝对路径,那还需要拷?外部的?件。 读取?件的?法:
2.1 read()
read():将?件中的内容全部读取出来。弊端: 占内存,如果?件过?,容易导致内存崩溃。f = open("../def/哇擦.txt", mode="r", encoding="utf-8") content = f.read() print(content)
结果: 友谊地久天?, 爱?点, 可惜我是?瓶座 ??中最爱
2.2 read(n)
read(n):读取n个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读?不 是从头读,如果使?的是rb模式,则读取出来的是n个字节。f = open("../def/哇擦.txt", mode="r" encoding="utf-8") content = f.read(3) print(content)
结果: 友谊地
f = open("../def/哇擦.txt", mode="rb") content = f.read(3) print(content)
结果: b'\xe5\x8f\x8b'
f = open("../def/哇擦.txt", mode="r", encoding="utf-8") content = f.read(3) content2 = f.read(3) print(content) print(content2)
结果: 友谊地 久天?
2.3 readline()
readline():?次读取??数据。注意: readline()结尾,注意每次读取出来的数据都会有? 个\n,所以呢,需要我们使?strip()?法来去掉\n或者空格。f = open("../def/哇擦.txt", mode="r", encoding="utf-8") content = f.readline() content2 = f.readline() content3 = f.readline() content4 = f.readline() content5 = f.readline() content6 = f.readline() print(content) print(content2) print(content3) print(content4) print(content5) print(content6)
结果: 友谊地久天?, 爱?点, 可惜我是?瓶座 ??中最爱
2.4 readlines()
readlines():将每??形成?个元素,放到?个列表中,将所有的内容都读取出来,所以 也是,容易出现内存崩溃的问题,不推荐使?。f = open("../def/哇擦.txt", mode="r", encoding="utf-8") lst = f.readlines() print(lst) for line in lst: print(line.strip())
2.5 循环读取
这种?式是组好的,每次读取??内容,不会产?内存溢出的问题。f = open("../def/哇擦.txt", mode="r", encoding="utf-8") for line in f: print(line.strip())注意: 读取完的?件句柄?定要关闭 f.close()
3. 写模式(w,wb)
写的时候注意,如果没有?件,则会创建?件,如果?件存在,则将原件中原来的内容删除,再 写入新内容。f = open("?娃娃", mode="w", encoding="utf-8") f.write("??狮王") f.flush() # 刷新. 养成好习惯 f.close()尝试读?读
f = open("?娃娃", mode="w", encoding="utf-8") f.write("??狮王") f.read() # not readable 模式是w. 不可以执?读操作 f.flush() f.close()wb模式下,可以不指定打开?件的编码,但是在写?件的时候必须将字符串转化成utf-8的 bytes数据。
f = open("?娃娃", mode="wb") f.write("??狮王".encode("utf-8")) f.flush() f.close()
4. 追加(a,ab)
在追加模式下,我们写入的内容会追加在?件的结尾。f = open("?娃娃", mode="a", encoding="utf-8") f.write("麻花藤的最爱") f.flush() f.close()ab模式??试?试就好了
5. 读写模式(r+,r+b)
对于读写模式,必须是先读,因为默认光标是在开头的,准备读取的。当读完了之后再进? 写入,我们以后使?频率最?的模式就是r+。 正确操作:f = open("?娃娃", mode="r+", encoding="utf-8") content = f.read() f.write("麻花藤的最爱") print(content) f.flush() f.close()错误操作:
结果: 正常的读取之后, 写在结尾
f = open("?娃娃", mode="r+", encoding="utf-8") f.write("哈哈") content = f.read() print(content) f.flush() f.close() 结果: 将开头的内容改写成了"哈哈", 然后读取的内容是后?的内容.所以记住: r+模式下,必须是先读取,然后再写入。
6. 写读(w+,w+b)
先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的,不常?。f = open("?娃娃", mode="w+", encoding="utf-8") f.write("哈哈") content = f.read() print(content) f.flush() f.close()有?会说,先读不就好了么? 错。w+ 模式下,?开始读取不到数据,然后写的时候再将原来的内容清空,所以,很少?。
7. 追加读(a+)
a+模式下,不论先读还是后读,都是读取不到数据的。f = open("?娃娃", mode="a+", encoding="utf-8") f.write("?化腾") content = f.read() print(content)还有?些其他的带b的操作,就不多赘述了,就是把字符换成字节,仅此?已。
f.flush() f.close()
8. 其他相关操作
8.1 seek(n)
seek(n):光标移动到n位置,注意,移动的单位是byte,所以如果是UTF-8的中?部分要 是3的倍数。 通常我们使?seek都是移动到开头或者结尾。 移动到开头: seek(0) 移动到结尾: seek(0,2) seek的第?个参数表?的是从哪个位置进?偏移,默认是0,表 ?开头,1表?当前位置,2表?结尾。f = open("?娃娃", mode="r+", encoding="utf-8") f.seek(0) # 光标移动到开头 content = f.read() # 读取内容, 此时光标移动到结尾 print(content) f.seek(0) # 再次将光标移动到开头 f.seek(0, 2) # 将光标移动到结尾 content2 = f.read() # 读取内容. 什么都没有 print(content2)
f.seek(0) # 移动到开头 f.write("张国荣") # 写?信息. 此时光标在9 中?3 * 3个 = 9
f.flush() f.close()
8.2 tell()
tell():使?tell()可以帮我们获取到当前光标在什么位置。f = open("?娃娃", mode="r+", encoding="utf-8") f.seek(0) # 光标移动到开头 content = f.read() # 读取内容, 此时光标移动到结尾 print(content) f.seek(0) # 再次将光标移动到开头 f.seek(0, 2) # 将光标移动到结尾 content2 = f.read() # 读取内容. 什么都没有 print(content2)
f.seek(0) # 移动到开头 f.write("张国荣") # 写?信息. 此时光标在9 中?3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush() f.close()
8.3 truncate() 截断文件
f = open("?娃娃", mode="w", encoding="utf-8") f.write("哈哈") # 写?两个字符 f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后?的所有内容 f.close()深坑请注意: 在r+模式下,如果读取了内容,不论读取内容多少,光标显?的是多少,再写入 或者操作?件的时候都是在结尾进?的操作。 所以如果想做截断操作,记住了,要先挪动光标,挪动到你想要截断的位置,然后再进?截断。 关于truncate(n),如果给出了n,则从开头开头进?截断,如果不给n,则从当前位置截断,后? 的内容将会被删除。
f = open("?娃娃", mode="r+", encoding="utf-8") content = f.read(3) # 读取12个字符 f.seek(4) print(f.tell()) f.truncate() # 后?的所有内容全部都删掉 # print(content) f.flush() f.close()
9. 修改文件以及另一种打开文件的方式
?件修改: 只能将?件中的内容读取到内存中,将信息修改完毕,然后将源?件删除,将新 ?件的名字改成老?件的名字。# ?件修改 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.replace("冰糖葫芦", "??梨") 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.replace("??梨", "冰糖葫芦") f2.write(new_line) os.remove("?娃娃") # 删除源?件 os.rename("?娃娃_new", "?娃娃") # 重命名新?件
内容总结
以上是互联网集市为您收集整理的python基础(10):文件操作全部内容,希望文章能够帮你解决python基础(10):文件操作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。