5. Python 文件操作

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.txtD:\bill.txt 就不报错。
原因:转义字符问题,计算机认为路径中的 “\b” 有歧义。类似的还有 \r、\t 等。

在这里插入图片描述

上述问题的其他解决方法:

路径字符串前加 “r”,如:r"D:\bill.txt"
原理:使路径中的转义字符失效, "\"只代表一个普通的字符。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值