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()

结果:
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'
rb的作⽤: 在读取非⽂本⽂件的时候,比如读取MP3、图像、视频等信息的时候就需要⽤到rb。因为这种数据是没办法直接显⽰出来的,在后⾯我们⽂件上传下载的时候还会⽤到,还有,我们看的直播,实际上都是这种数据。
绝对路径和相对路径:
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)

f.flush()
f.close()
还有⼀些其他的带b的操作,就不多赘述了,就是把字符换成字节,仅此⽽已。

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()

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()
深坑请注意: 在r+模式下,如果读取了内容,不论读取内容多少,光标显⽰的是多少,再写入
或者操作⽂件的时候都是在结尾进⾏的操作。
所以如果想做截断操作,记住了,要先挪动光标,挪动到你想要截断的位置,然后再进⾏截断。
关于truncate(n),如果给出了n,则从开头开头进⾏截断,如果不给n,则从当前位置截断,后⾯
的内容将会被删除。

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):文件操作的更多相关文章

  1. python基础篇(文件操作)

    Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...

  2. python基础之文件操作

    对于文件操作中最简单的操作就是使用print函数将文件输出到屏幕中,但是这种操作并不能是文件保存到磁盘中去,如果下调用该数据还的重新输入等. 而在python中提供了必要的函数和方法进行默认情况下的文 ...

  3. Day3 Python基础学习——文件操作、函数

    一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过文件句柄对文件进行操作 关闭文件 #打开文件,读写文件,关闭文件 http://www.cnblogs.com/linha ...

  4. 【python基础】文件操作

    文件操作目录 一 .文件操作 二 .打开文件的模式 三 .操作文件的方法 四 .文件内光标移动 五. 文件的修改 一.文件操作介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用pyt ...

  5. Python基础学习——文件操作、函数

    一.文件操作 文件操作链接:http://www.cnblogs.com/linhaifeng/articles/5984922.html(更多内容见此链接) 一.对文件操作流程 打开文件,得到文件句 ...

  6. python基础14_文件操作

    文件操作,通常是打开,读,写,追加等.主要涉及 编码 的问题. #!/usr/bin/env python # coding:utf-8 ## open实际上是从OS请求,得到文件句柄 f = ope ...

  7. (Python基础)文件操作

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 命名为7 years Once I was seven years old my momma t ...

  8. python基础4文件操作

    在磁盘上读取文件的 功能都是由操作系统来实现的,不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据( ...

  9. Python基础 之 文件操作

    文件操作 一.路径 文件绝对路径:d:\python.txt 文件相对路径:在IDEA左边的文件夹中 二.编码方式 utf-8 gbk... 三.操作方式 1.只读 r 和 rb 绝对路径的打开操作 ...

随机推荐

  1. ReactNative: 使用标签栏组件TabBarIOS组件

    一.简介 标签栏Tab的作用对于应用程序那是不言而喻的,它是应用程序中除了导航栏组件外的又一个核心组件,使用它可以实现页面的切换.RN提供了一个TabBarIOS组件来完成页面的切换(视图或者路由), ...

  2. vue-router之前端路由的学习总结

    什么是路由 路由就是通过互联网把信息从源地址传输到目的地的活动 --维基百科 举例路由器: 路由器提供了两种机制:路由和转送 路由是决定数据包从来源到目的地的路径 转送将输入端的数据转移到合适的输出端 ...

  3. 【xAsset框架】HFS 轻量级HTTP Server快速入门指南

    一.引子 最近马三有幸参与开发了一个简易轻量的Unity资源管理框架 xAsset ,xasset 提供了一种使用资源路径的简单的方式来加载资源,简化了Unity项目资源打包,更新,加载,和回收的作业 ...

  4. Vue 从入门到进阶之路(十二)

    之前的文章我们介绍了一下 vue 中插槽的使用,本章我们接着介绍一下 vue 中的作用域插槽. <!DOCTYPE html> <html lang="en"&g ...

  5. 程序员修神之路--redis做分布式锁可能不那么简单

    菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个分布式锁,很简单 不管你基于什么做分布式锁,你觉得很 ...

  6. Elasticsearch 6.x版本全文检索学习之数据建模

    1.什么是数据建模. 答:数据建模,英文为Data Modeling,为创建数据模型的过程.数据模型Data Mdel,对现实世界进行抽象描述的一种工具和方法,通过抽象的实体及实体之间联系的形式去描述 ...

  7. css基础,css选择器

    07.29自我总结 css基础 一.什么是CSS CSS是级联样式表 CSS术语标记语言,没有逻辑 CSS作用 完成网页内容的样式与布局 二.CSS的三种引入方式 1. 内联式 书写位置:在 head ...

  8. Implement Custom Business Classes and Reference Properties实现自定义业务类和引用属性(EF)

    In this lesson, you will learn how to implement business classes from scratch. For this purpose, the ...

  9. Bootstrap Bootstrap表格插件bootstrap-table配置与应用小结

    Bootstrap表格插件bootstrap-table配置与应用小结   by:授客 QQ:1033553122 1.   测试环境 win7 JQuery-3.2.1.min.js 下载地址: h ...

  10. UI视图控件、视图嵌套、SubView、Tag 的使用

    - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchO ...