声明
文章是基于:
哔哩哔哩上的《黑马程序员python教程,8天python从入门到精通,学python看这套就够了》视频教程所做的学习笔记,仅为学习使用!!如有侵权,联系删除
目录
一、文件的编码
-
计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
-
使用编码技术(密码本)将内容翻译成0和1存入
-
编码技术即:翻译的规则,记录了如何将内容翻译-->二进制,以及如何将二进制翻译-->可识别内容
-
计算机中有许多可用编码:
-
UTF-8
-
GBK
-
Big5等
-
不同的编码,将内容翻译成二进制也是不同的
-
-
编码有许多,所以要使用正确的编码, 才能对文件进行正确的读写操作
-
UTF-8是目前全球通用的编码格式,一律以UTF-8格式进行文件编码即可
-
-
操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别
二、文件的读取
(一)open()打开函数
-
使用open函数,可以打开一个已经存在的文件,或者创建一个新文件:
-
open(name, mode, encodimg) open("D:/11.txt", "r", encoding = "UTF-8")
-
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
-
mode:设置打开文件的模式(访问模式):只读、写入、追加等
-
encoding:编码格式(推荐使用UTF-8)
-
encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定
-
-
(二)mode常用的三种基础访问模式
(三)读操作相关方法
-
文件读取本质上存在一个指针,当我们打开文件开始读取之后,不管调用什么方法都会续接上一次读取文件的方法,虽然read()和readlines()是不同的方法,但打开的是同一个文件对象,也会续接上一个方法去读取
1、read()方法
文件对象.read(num)
-
num表示要从文件中读取的数据的长度(单位是字节)
-
如果没有传入num,那么就表示读取文件中所有的数据
-
一段程序中有多个read方法,第二个read会从第一个read读取的末尾作为开头,继续往下读取
-
得到的结果是一个字符串
2、readlines()方法
-
readlines可以按照行的方式把整个文件中的内容进行一次性读取
-
返回的是一个列表
-
其中每一行的数据为一个元素
-
f = open("python.txt", "r", encoding = "UTF-8") content = f.readlines() # ['hello world\n', 'abcdefg\n', 'bbb]\n', 'ccc'] print(content) # 关闭文件 f.close()
3、readline()方法
-
调用一次,读取一行内容
-
f = open('python.txt', "r", encoding = "UTF-8") content = f.readline() print(f"第一行:{content}") content = f.readline() print(f"第二行:{content}")
4、for循环读取文件行
for line in open("python.txt", "r", encoding = "UTF-8"):
or
f = open("python.txt", "r")
for line in f:
print(f"每一行数据是:{line}")
# 每一个line临时变量,就记录了文件的一行数据
5、close()关闭文件对象
f = open("python.txt", "r", encoding = "UTF-8")
f.close()
# 最后通过close,关闭文件对象,也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用
6、with open语法
# f是文件对象别名称
with open("python.txt", "r", encoding = "UTF-8") as f:
for line in f:
print(f"每一行的内容{line}")
# 通过在with open的语句块中对文件进行操作
# 可以在操作完成后在自动关闭close文件,避免遗忘掉close方法
(四)练习
# 打开文件,以读取模式打开
f = open("E:/Heima_Python_Learning/08_文件/word.txt", "r", encoding = "UTF-8")
# 方式1:read()方法都区全部内容,通过字符串count方法统计itheima单词数量
content = f.read()
count = content.count("ieheima")
# 方式2:读取内容,一行一行读取
count = 0
for line in f:
line = line.strip() # 去除开头和结尾的空格以及换行符,结果是一行行字符串
# 换行会在读取文件内容时,读出\n
words = line.split(" ") # 通过空格切分,将一行的单词取出 结果是一个列表
for word in words:
if word == "itheima":
count += 1 # 单词是itheima,则数量+1
# 关闭文件
f.close()
三、文件的写入
-
# 1.打开文件 f = open("python.txt", "w", encoding = "UTF-8") # 2.文件写入 f.write('hello world') # 3.内容刷新 f.flush() # colse方法,内置了flush功能 f.close()
-
直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
-
当调用flush的时候,内容会真正写入硬盘中文件
-
这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
-
-
文件如果不存在,使用
w
模式,会创建新文件 -
文件如果存在,使用
w
模式,会将原有内容清空
四、文件的追加
# 1、打开文件,通过a模式打开即可
f = open("python.txt", "a", encoding = "UTF-8")
# 2、文件写入
f.write("hello world")
# 3、内容刷新
f.flush()
-
a模式,文件不存在会创建文件
-
a模式,文件存在会在最后,追加写入文件
五、综合案例
"""
一般情况下,Python解释器会将遇到的‘\’识别为路径,会自动增加一个’'以便和转义字符进行区分,但若遇到转义字符则不增加‘\’
文件路径中若包含‘\0’、‘\t’ 等特殊转义字符时要特别注意
推荐文件路径写法: /
斜杠反过来了,这样就不会出现歧义了
"""
# 打开文件得到文件对象,准备读取
fr = open("E:/Heima_Python_Learning/08_文件/bill.txt", "r", encoding = "UTF-8")
# 打开文件得到文件对象,准备写入
fw = open("E:/Heima_Python_Learning/08_文件/bill.txt.bak", "w", encoding="UTF-8")
# for循环读取文件
for line in fr:
line = line.strip() # 去除首位的空格以及换行符
# 判断内容,将满足的内容写出
if line.split(",")[4] == "测试" : # split方法会得到一个列表对象
continue
# 将内容写出
fw.write(line)
# 由于前面对内容进行了strip()的操作,所以要手动的写出换行符
fw.write("\n")
# close关闭2个文件对象
fr.close()
fw.close() # 写文件调用close()会自动flush