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. Laravel-权限系统

    总结Auth中间件用于定义未登录用户只能操作哪些权限policy授权策略定义了当前用户实例与进行授权的用户是否匹配,一致才能进一步操作,否则返回403禁止访问异常场景:用户登录 Auth步骤 找到需要 ...

  2. Kafka基本知识整理

    首先Kafka是一个分布式消息队列中间件,Apache顶级项目,https://kafka.apache.org/   高性能.持久化.多副本备份.横向扩展. 生产者Producer往队列里发送消息, ...

  3. Kubernetes的三种探针

    k8s支持存活livenessProbe和就绪readinessProbe两种探针 两种探针都支持以下三种方式 1.exec 通过执行shell命令的方式,判断退出状态码是否是0 示例 exec: c ...

  4. (四十)c#Winform自定义控件-开关-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  5. (转)python中用logging实现日志滚动和过期日志删除

    转自:https://blog.csdn.net/ashi198866/article/details/46725813 logging库提供了两个可以用于日志滚动的class(可以参考https:/ ...

  6. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  7. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之一:准备工作

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. 利用keras进行手写数字识别模型训练,并输出训练准确度

    from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.lo ...

  9. Linux相关集合

    本篇概述 Linux xshell6 连接 Hadoop 启动关闭 Linux xshell6 连接相关问题 首先,虚拟机 得先能通成网(具体教程可百度) 然后,进行 本机 ip 的查询(xshell ...

  10. axel 多线程下载工具

    yum install axel-2.4-9.el7.x86_64 -y # 选项 --max-speed=x , -s x 最高速度x --num-connections=x , -n x 连接数x ...