当前位置: 首页 > news >正文

python基础语法(十一)

目录

  • 文件
    • 文件是什么
    • 文件路径
    • 文件操作
      • 1. 打开文件
      • 关闭文件
      • 写文件
      • 读文件
    • 关于中文的处理
    • 使用上下文管理器

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒个人主页
🥸🥸🥸C语言
🐿️🐿️🐿️C语言例题
🐣🐓🏀python

文件

文件是什么

变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失.

要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存

在 Windows “此电脑” 中, 看到的内容都是 文件

通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:
文本文件 (txt)
可执行文件 (exe, dll)
图片文件 (jpg, gif)
视频文件 (mp4, mov)
office 文件 (.ppt, docx)

文件路径

一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 “文件夹”(也叫做目录)来整理文件

实际一个文件往往是放在一系列的目录结构之中的

为了方便确定一个文件所在的位置, 使用文件路径来进行描述

举个例子:我们用Everthing来搜索QQ的一些文件(这里顺便推荐一下,用Everthing搜索文件非常的方便)
在这里插入图片描述
我们可以看到红线所标记的就是文件的路径
在这里插入图片描述

D: 表示 盘符. 不区分大小写.

每一个 \ 表示一级目录. 当前 QQ.exe 就是放在 “D 盘下的 program 目录下的 qq 目录下的 Bin 目录中” .

目录之间的分隔符, 可以使用 \ 也可以使用 / . 一般在编写代码的时候使用 / 更方便.

上述以 盘符 开头的路径, 我们也称为 绝对路径.

除了绝对路径之外, 还有一种常见的表示方式是相对路径.

相对路径需要先指定一个基准目录, 然后以基准目录为参照点, 间接的找到目标文件.

描述一个文件的位置, 使用绝对路径和相对路径都是可以的. 对于新手来说, 使用 绝对路径更简单更好理解, 也不容易出错

文件操作

要使用文件, 主要是通过文件来保存数据, 并且在后续把保存的数据读取出来.

但是要想读写文件, 需要先 “打开文件”, 读写完毕之后还要 “关闭文件”

1. 打开文件

使用内建函数 open 打开一个文件

f = open('d:/test.txt', 'r')

第一个参数是一个字符串, 表示要打开的文件路径

第二个参数是一个字符串, 表示打开方式. 其中 r 表示按照读方式打开. w 表示按照写方式打开. a表示追加写方式打开.

如果打开文件成功, 返回一个文件对象. 后续的读写文件操作都是围绕这个文件对象展开.

如果打开文件失败(比如路径指定的文件不存在), 就会抛出异常

关闭文件

使用 close 方法关闭已经打开的文件.

f.close()

使用完毕的文件要记得及时关闭

一个程序能同时打开的文件个数, 是存在上限的.

flist = []
count = 0
while True:f = open('d:/test.txt', 'r')flist.append(f)count += 1print(f'count = {count}')

如上面代码所示, 如果一直循环的打开文件, 而不去关闭的话, 就会出现上述报错.

当一个程序打开的文件个数超过上限, 就会抛出异常.

注意: 上述代码中, 使用一个列表来保存了所有的文件对象. 如果不进行保存, 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件.

但是由于垃圾回收操作不一定及时, 所以我们写代码仍然要考虑手动关闭, 尽量避免依赖自动关闭

写文件

文件打开之后, 就可以写文件了.

写文件, 要使用写方式打开, 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')

读文件

读文件内容需要使用 ‘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()

关于中文的处理

当文件内容存在中文的时候, 读取文件内容不一定就顺利.

同样上述代码, 执行时可能会出现异常,也有可能出现乱码

计算机表示中文的时候, 会采取一定的编码方式, 我们称为 “字符集”

所谓 “编码方式” , 本质上就是使用数字表示汉字.

我们知道, 计算机只能表示二进制数据. 要想表示英文字母, 或者汉字, 或者其他文字符号, 就都要通过编码.

最简单的字符编码就是 ascii. 使用一个简单的整数就可以表示英文字母和阿拉伯数字.

但是要想表示汉字, 就需要一个更大的码表.

一般常用的汉字编码方式, 主要是 GBK 和 UTF-8

必须要保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现上述问题

使用记事本打开文本文件, 在 “菜单栏” -> “文件” -> “另存为” 窗口中, 可以看到当前文件的编码方式

在这里插入图片描述
如果此处的编码为 ANSI , 则表示 GBK 编码.

如果此处为 UTF-8 , 则表示 UTF-8 编码

此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决.

f = open('d:/test.txt', 'r', encoding='utf8')

字符编码问题, 是编程中一类比较常见, 又比较棘手的问题. 需要对于字符编码有一定的理解, 才能从容应对.

使用上下文管理器

打开文件之后, 是容易忘记关闭的. Python提供了上下文管理器 , 来帮助程序猿自动关闭文件

使用 with 语句打开文件.

当 with 内部的代码块执行完毕后, 就会自动调用关闭方法

with open('d:/test.txt', 'r', encoding='utf8') as f:lines = f.readlines()print(lines)

相关文章:

  • 研发效能认证学员作品:快速进行持续集成应用实践丨IDCF
  • 使用pycharm远程连接到Linux服务器进行开发
  • ES6中数值扩展
  • 论文-分布式-并发控制-并发控制问题的解决方案
  • 【面试经典150 | 栈】最小栈
  • 2023辽宁省赛E
  • 【QT】其他常用控件1
  • 【网络协议】聊聊UDP协议
  • 从InnoDB索引的数据结构,去理解索引
  • 调试记录 单片机GD32F103C8T6(兆易创新) 程序烧写完成但是没有现象 (自己做的板子)
  • Netty优化-rpc
  • idea 提升效率的常用快捷键 汇总
  • Kafka KRaft模式探索
  • 帆软report JS实现填报控件只能填写一次
  • mac电脑怎么永久性彻底删除文件?
  • [LeetCode] Wiggle Sort
  • 【node学习】协程
  • Android 控件背景颜色处理
  • android图片蒙层
  • ECS应用管理最佳实践
  • ES2017异步函数现已正式可用
  • es6
  • flutter的key在widget list的作用以及必要性
  • GraphQL学习过程应该是这样的
  • leetcode388. Longest Absolute File Path
  • node学习系列之简单文件上传
  • WePY 在小程序性能调优上做出的探究
  • 时间复杂度与空间复杂度分析
  • 一些css基础学习笔记
  • NLPIR智能语义技术让大数据挖掘更简单
  • raise 与 raise ... from 的区别
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)共用体union的用法举例
  • (LeetCode C++)盛最多水的容器
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Ruby)Ubuntu12.04安装Rails环境
  • (算法)Game
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理出现中文乱码的情况
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net mvc部分视图
  • .net 获取url的方法
  • :“Failed to access IIS metabase”解决方法
  • :=
  • @private @protected @public
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ Linux ] Linux信号概述 信号的产生
  • [ SNOI 2013 ] Quare
  • [ARM]ldr 和 adr 伪指令的区别
  • [C# 网络编程系列]专题六:UDP编程
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [codeforces]Levko and Permutation