【Python】文件操作

目录

文件

文件是什么

文件路径

文件操作

1. 打开文件

2. 关闭文件

3. 写文件

4. 读文件

关于中文的处理

使用上下文管理器

总结不易~本章节对我有很大的收获,希望对你也是~~~~


文件

文件是什么

变量是把数据保存到内存中 . 如果程序重启 / 主机重启 , 内存中的数据就会丢失 .
要想能让数据被持久化存储 , 就可以把数据存储到硬盘中 . 也就是在 文件 中保存 .
Windows " 此电脑 " , 看到的内容都是 文件.
通过文件的后缀名 , 可以看到文件的类型 . 常见的文件的类型如下 :
文本文件 (txt)
可执行文件 (exe, dll)
图片文件 (jpg, gif)
视频文件 (mp4, mov)
office 文件 (.ppt, docx)
......

文件路径

一个机器上 , 会存在很多文件 , 为了让这些文件更方面的被组织 , 往往会使用很多的 " 文件夹 "( 也叫做 目录 )来整理文件.
实际一个文件往往是放在一系列的目录结构之中的 .
为了方便确定一个文件所在的位置 , 使用 文件路径 来进行描述 .
例如 , 上述截图中的 QQ.exe 这个文件 , 描述这个文件的位置 , 就可以使用路径
D:\program\qq\Bin\QQ.exe 来表示 .
D: 表示 盘符 . 不区分大小写 .
每一个 \ 表示一级目录 . 当前 QQ.exe 就是放在 "D 盘下的 program 目录下的 qq 目录下的 Bin 目录中" .
目录之间的分隔符 , 可以使用 \ 也可以使用 / . 一般在编写代码的时候使用 / 更方便 .
上述以 盘符 开头的路径 , 我们也称为 绝对路径 .
除了绝对路径之外 , 还有一种常见的表示方式是 相对路径 . 相对路径需要先指定一个基准目录 , 然后以基准目录为参照点, 间接的找到目标文件 . 咱们课堂上暂时不详细介绍 .
描述一个文件的位置 , 使用 绝对路径 相对路径 都是可以的 . 对于新手来说 , 使用 绝对路径 更简单更好理解, 也不容易出错 .

文件操作

要使用文件 , 主要是通过文件来保存数据 , 并且在后续把保存的数据读取出来 .
但是要想读写文件 , 需要先 " 打开文件 ", 读写完毕之后还要 " 关闭文件 ".

1. 打开文件

打开方式含义
‘r’ 以读方式打开文件(默认)
‘w’以覆盖写方式打开文件,如果文件不存在则先创建再打开
‘a’ 以追加写方式打开文件,如果文件不存在则先创建再打开
‘x’创建文件并以写方式打开,如果文件已存在则会抛出异常
‘b’ 以二进制方式打开文件
‘t’以文本方式打开文件(默认)
‘+’ 打开磁盘文件进行更新(读取与写入)

打开文件的编码方式

使用内建函数 open 打开一个文件 .
f = open('d:/test.txt', 'r')
第一个参数是一个字符串 , 表示要打开的文件路径
第二个参数是一个字符串 , 表示打开方式 . 其中 r 表示按照读方式打开 . w 表示按照写方式打开 . a 表示追加写方式打开.
如果打开文件成功 , 返回一个文件对象 . 后续的读写文件操作都是围绕这个文件对象展开 .
如果打开文件失败 ( 比如路径指定的文件不存在 ), 就会抛出异常 .

这里的第8189个文件是一个特殊的数字,因为8189 + 3 就是2 的13次方,+ 3 就是有标准输出、标准输入和标准错误三个文件被默认打开

由于这里是将f存入列表fList内,所以不会被python的垃圾回收机制给判定为垃圾被回收掉,而是知道存不下去了就被强制终止

如果去掉fList.appen(f)这一句,python就会用自带的垃圾回收机制,来不断回收f这个文件操作符,从而可以一直将文件进行打开!!!

2. 关闭文件

使用 close 方法关闭已经打开的文件
f.close()
使用完毕的文件要记得及时关闭 !
一个程序能同时打开的文件个数 , 是存在上限的 .
flist = []
count = 0
while True:
    f = open('d:/test.txt', 'r')
    flist.append(f)
    count += 1
    print(f'count = {count}')

如上面代码所示 , 如果一直循环的打开文件 , 而不去关闭的话 , 就会出现上述报错 .
当一个程序打开的文件个数超过上限 , 就会抛出异常 .
注意 : 上述代码中 , 使用一个列表来保存了所有的文件对象 . 如果不进行保存 , 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件 .
但是由于垃圾回收操作不一定及时 , 所以我们写代码仍然要考虑手动关闭 , 尽量避免依赖自动关闭

3. 写文件

# 使用write 来实现写文件操作
# 'w' 如果是用写方式打开 就会清空掉原本文件的内容
f = open('d:/pythonWork/test.txt','w')
f.write('h1h\n')
f.close()

# 'a' 追加方式打开
f = open('d:/pythonWork/test.txt','a')
f.write("2222")
f.close()
文件打开之后 , 就可以写文件了 .
写文件 , 要使用写方式打开 , open 第二个参数设为 'w'
使用 write 方法写入文件
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
用记事本打开文件 , 即可看到文件修改后的内容 .
如果是使用 'r' 方式打开文件 , 则写入时会抛出异常
f = open('d:/test.txt', 'r')
f.write('hello')
f.close()

使用 'w' 一旦打开文件成功 , 就会清空文件原有的数据 .
使用 'a' 实现 " 追加写 ", 此时原有内容不变 , 写入的内容会存在于之前文件内容的末尾
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f = open('d:/test.txt', 'a')
f.write('world')
f.close()
针对已经关闭的文件对象进行写操作 , 也会抛出异常
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f.write('world')

4. 读文件

# 1. 使用read 来读取文件内容 只当读几个字符
f = open('d:/pythonWork/test.txt','r',encoding='utf8')
ret = f.read(10)
print(ret)
f.close()

# 2. 更常见的需求是按行来读取
# 最简单的办法就是for循环
f = open('d:/pythonWork/test.txt','r')
for i in f:
    print(i,end = "")
f.close()

print("\n")

# 3. 还可以使用readlines 方法直接把整个文件所有内容全部都读出来,按照行组织到一个列表里面
f = open('d:/pythonWork/test.txt','r')
lines = f.readlines()
print(lines)  # ['h1h\n', '2222']
f.close()  
读文件内容需要使用 'r' 的方式打开文件
使用 read 方法完成读操作 . 参数表示 " 读取几个字符 "
f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()

如果文件是多行文本 , 可以使用 for 循环一次读取一行

床前明月光
疑是地上霜
举头望明月
低头思故乡


先构造一个多行文件 .
f = open('d:/test.txt', 'r')
for line in f:
    print(f'line = {line}')
f.close()

注意 : 由于文件里每一行末尾都自带换行符 , print 打印一行的时候又会默认加上一个换行符 , 因此打印结果看起来之间存在空行.
使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉
使用 readlines 直接把文件整个内容读取出来 , 返回一个列表 . 每个元素即为一行
f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()

此处的 \n 即为换行符 .

关于中文的处理

当文件内容存在中文的时候 , 读取文件内容不一定就顺利 .
同样上述代码 , 有的同学执行时可能会出现异常

计算机表示中文的时候 , 会采取一定的编码方式 , 我们称为 " 字符集 "
所谓 " 编码方式 " , 本质上就是使用数字表示汉字 .
我们知道 , 计算机只能表示二进制数据 . 要想表示英文字母 , 或者汉字 , 或者其他文字符号 , 就都要通过编码.
最简单的字符编码就是 ascii. 使用一个简单的整数就可以表示英文字母和阿拉伯数字 .
但是要想表示汉字 , 就需要一个更大的码表 .
一般常用的汉字编码方式 , 主要是 GBK UTF-8
必须要保证文件本身的编码方式 , Python 代码中读取文件使用的编码方式匹配 , 才能避免出现上述问题.
Python3 中默认打开文件的字符集跟随系统 , Windows 简体中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的编码 , 直接就能正确处理 .
如果文件本身是其他编码 ( 比如 UTF-8), 那么直接打开就可能出现上述问题
使用记事本打开文本文件 , " 菜单栏 " -> " 文件 " -> " 另存为 " 窗口中 , 可以看到当前文件的编码方式

如果此处的编码为 ANSI , 则表示 GBK 编码 .
如果此处为 UTF - 8 , 则表示 UTF-8 编码 .
此时修改打开文件的代码 , open 方法加上 encoding 参数 , 显式的指定为和文本相同的字符集 , 问题即可解决.
f = open ( 'd:/test.txt' , 'r' , encoding = 'utf8' )
PS: 字符编码问题 , 是编程中一类比较常见 , 又比较棘手的问题 . 需要对于字符编码有一定的理解 ,
能从容应对 . 同学们可以参考腾讯官方账号发表的帖子, 详细介绍了里面的细节.http:// https://zhuanlan.zhihu.com/ p/46216008

使用上下文管理器

打开文件之后 , 是容易忘记关闭的 . Python 提供了 上下文管理器 , 来帮助程序猿自动关闭文件 .
使用 with 语句打开文件 .
with 内部的代码块执行完毕后 , 就会自动调用关闭方法 .
with open('d:/test.txt', 'r', encoding='utf8') as f:
    lines = f.readlines()
    print(lines)
# 上下文管理器
# 当with 对应的代码块执行结束,就会自动的执行f的close

def fn() :
    with open('d:/pythonWork/test.txt','r') as f:
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        if True:
            return
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码
        # 这有很多代码

总结不易~本章节对我有很大的收获,希望对你也是~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值