文章目录
- 1. 文件的编码
- 2. 文件打开
- 2. 文件的读取
- 3. 文件的写入
- 4. 文件的追加
- 5. 文件操作综合案例
1. 文件的编码
什么是编码?
编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。
编码有许多中,我们最常用的是 UTF-8 编码。
为什么需要使用编码?
计算机只认识 0 和 1,所以需要将内容翻译成 0 和 1 才能保存在计算机中。
同时也需要编码,将计算机保存的 0 和 1,反向翻译回可以识别的内容。
2. 文件打开
使用 open 函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:open(name, mode, encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8)
示例代码:
# encoding的顺序不是第三位,所以不能用位置参数,要用关键字参数直接指定
f= open('D:/python.txt', 'r', encoding="UTF-8")
print(type(f))#<class '_io.TextIOWrapper'>
注意:此时的 f 是 open 函数的文件对象,对象是 Python 中一种特殊的数据类型,拥有属性和方法。可以使用对象.属性
、对象.方法
对其进行访问。
mode常用的三种基础访问模式:
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 若以 ”r“ 方式打开一个不存在的文件,会报错。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
2. 文件的读取
(1) read() 方法文件对象.read(num)
num 表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,就表示读取文件中所有的数据。
f= open('D:/python.txt', 'r', encoding="UTF-8")
print(f"读取10个字节:{f.read(10)}")
print(f"读取全部内容:{f.read()}")
f.close()#关闭文件,否则文件会一直被占用
文件内容:
输出结果:
读取10个字节:1234567890
读取全部内容:abcdefhijklmnopq
rstuvwxyz
可以看到,“读取全部内容” 读的是 “读取10个字节” 之后的内容。
(2) readlines() 方法
readlines 可以按照行的方式把整个文件中的内容进行一次性读取,返回的是一个列表,其中每一行的数据为一个元素。
f= open('D:/python.txt', 'r', encoding="UTF-8")
lines = f.readlines()
print(lines)
print(type(lines))
f.close()#关闭文件,否则文件会一直被占用
输出结果:
['1234567890abcdefhijklmnopq\n', 'rstuvwxyz']
<class 'list'>
注意:每个元素末尾有\n,最后一个元素末尾可能没有。
(3) readline() 方法
readline() 方法一次读取一行内容。
f = open('D:/python.txt')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')
f.close()#关闭文件,否则文件会一直被占用
输出结果:
第一行:1234567890abcdefhijklmnopq
第二行:rstuvwxyz
(4) for 循环读取文件行
f = open("D:/python.txt", "r")
#每一个linel临时变量,记录了文件的一行数据
for line in f:
print(line)
f.close()#关闭文件,否则文件会一直被占用
输出结果:
1234567890abcdefhijklmnopq
rstuvwxyz
(5) with open
使用 with open 对文件进行操作,可以在操作完成后自动 close 文件,避免忘记 close。
with open("D:/python.txt","r") as f:
for line in f:
print(line)
输出结果:
1234567890abcdefhijklmnopq
rstuvwxyz
【例】将如下内容,复制并保存到:word.txt。
itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima
通过文件读取操作,读取此文件,统计itheima单词出现的次数。
方法1:
f = open("D:/word.txt", "r", encoding="utf-8")
print(f.read().count("itheima"))#输出6
方法2:
f = open("D:/word.txt", "r", encoding="utf-8")
sum = 0
for line in f:
line = line.strip("\n")
words = line.split(" ")
for word in words:
if word == "itheima":
sum +=1
print(sum)
f.close()#输出6
方法3:
sum = 0
with open("D:/word.txt", "r") as f:
for line in f:
sum += line.count("itheima")
print(sum)#输出6
3. 文件的写入
#1.打开文件
f = open("D:/python.txt", "w", encoding="utf-8")
#2.文件写入
f.write("hello world")
#3.内容刷新
f.flush()
#...
#f.close()
注意:
- w 模式:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件。
- 直接调用 write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区。
当调用 flush(或 close,close 方法内置了 flush 的功能)的时候,内容才会真正写入文件。
这样做是避免频繁的操作硬盘,导致效率下降(攒一堆一次性写磁盘效率高)。
4. 文件的追加
#1.打开文件,通过a模式打开即可
f = open("D:/python.txt", "a", encoding="utf-8")
#2.文件写入
f.write("你好hhhh")#如果想要换行追加,可以用\n
#3.内容刷新
f.flush()
#...
#f.close()
注意:
a模式:若文件不存在,会创建文件;若文件存在,会在最后追加写入。
5. 文件操作综合案例
需求:有一份账单文件,记录了消费收入的具体记录,内容如下:
name,date,money,type,remarks
tom,2022-01-01,100000,消费,正式
tom,2022-01-02,300000,收入,正式
tom,2022-01-03,100000,消费,测试
jerry,2022-01-01,200000,收入,正式
jerry,2022-01-02,100000,消费,测试
jerry,2022-01-03,100000,消费,正式
jerry,2022-01-04,100000,消费,测试
jerry,2022-01-05,500000,收入,正式
jack,2022-01-01,100000,消费,正式
jack,2022-01-02,500000,收入,正式
jack,2022-01-03,900000,收入,测试
smith,2022-01-01,500000,消费,正式
smith,2022-01-02,300000,消费,测试
smith,2022-01-03,950000,收入,正式
sandy,2022-01-01,300000,消费,测试
sandy,2022-01-02,100000,消费,正式
sandy,2022-01-03,300000,消费,正式
可以将内容身制并保存为bil1.txt文件。我们现在要做的就是:
(1)读取文件
(2)将文件写出到bill.txt.bak文件作为备份
(3)同时,将文件内标记为测试的数据行丢弃
fr = open("D:/bill.txt", "r", encoding="utf-8")
fw = open("D:/bill.txt.bak", "w", encoding="utf-8")
fw.write(fr.readline())#写入第一行
for line in fr:
if line.strip().endswith("正式"):#以“正式”结尾
fw.write(line)
fr.close()
fw.close()
bill.txt.bak 文件写入结果:
bug 记录:
文件路径写成 D:\bill.txt 会报错,写成 D:/bill.txt 或 D:\bill.txt 就不报错。
原因:转义字符问题,计算机认为路径中的 “\b” 有歧义。类似的还有 \r、\t 等。
上述问题的其他解决方法:
路径字符串前加 “r”,如:r"D:\bill.txt"。
原理:使路径中的转义字符失效, "\"只代表一个普通的字符。