python文件操作

Python文件操作

1 文件的编码

1.1 背景

thinking:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?

answer:使用编码技术(密码本)将内容翻译成0和1存入。

编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。

计算机中有许多可用编码:

  • UTF-8
  • GBK
  • Big5
  • ...

不同的编码,将内容翻译成二进制也是不同的。

UTF-8是目前全球通用的编码格式。除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。

image-20230805113204807
1.2 总结
1.2.1 什么是编码?
  • 编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。
  • 编码有许多中,我们最常用的是UTF-8编码。
1.2.2 为什么需要使用编码?
  • 计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。
  • 同时也需要编码,将计算机保存的0和1,反向翻译回可以识别的内容。

2 文件的读取

2.1 什么是文件
  • 内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。

  • 一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。

2.2 文件操作的内容

在日常生活中,文件操作主要包括打开、关闭、读、写等操作。

2.3 文件的操作步骤

大概可以分为三个步骤(简称文件操作三步走):

  1. 打开文件

  2. 读写文件

  3. 关闭文件

注意:可以只打开和关闭文件,不进行任何读写。

2.3.1 open()打开函数

在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下

(1)open()函数,open(name, mode, encoding)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读 r 、写入 w (如果该文件己存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件)、追加 a (打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后如果该文件不存在,创建新文件进行写入等。
encoding:指定编码格式(推荐使用UTF-8)。

`f = open(r'D:\git\ceshi.txt', 'r', encoding='utf-8')`

'f'是open函数的文件对象

(2)with open()函数

with open('python.txt', 'r') as fo:   

fo.readlines()

通过在with open的语句块中对文件进行操作 # 可以在操作完成后自动关闭close文件,避免遗忘掉close方法。

2.3.2 读操作相关方法

(1)read()方法:

文件对象.read(num)

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

image-20230804225657148 image-20230804231149674

(2)readlines()方法:

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

image-20230804232152909

(3)readline()方法,一次读取一行内容

image-20230804232632102 image-20230804233600040

(4)for循环读取文件行,读取文件的全部内容

image-20230804234119425

(5)close():关闭文件对象

f = open('python.txt', "r")

f.close() 

最后通过close(),关闭文件对象,也就是关闭对文件的占用。

文件读取完成后,要使用文件对象close()方法关闭文件对象,否则文件会被一直占用。如果不调用close,同时程序没有停止运行,那么这个文件将一直被python程序占用。

2.3.3 操作汇总

image-20230805000635037

3 文件的写入

f = open(r'D:\git\ceshi.txt', 'w', encoding='utf-8')
f.write("123")
f.close()
  • 文件如果不存在,使用”w”模式,会创建新文件
  • 文件如果存在,使用”w”模式,会将原有内容清空
  • 直接调用write(),内容并为真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
  • flush(),立即刷新内容到硬盘中
  • close()方法,带有flush()方法的功能

image-20230805073534252

4 文件的追加

f = open(r'D:\git\ceshi.txt', 'a', encoding='utf-8')
f.write("123")
f.close()
  • a模式,文件不存在会创建文件
  • a模式,文件存在会在最后,追加写入文件
  • 可以使用'\n',写出换行符
image-20230805075231070 image-20230805075609437

5 文件操作综合案例

# 打开文件得到文件对象,准备读取
fr = open(r'D:\git\ceshi.txt', "r", encoding="UTF-8")
\# 打开文件得到文件对象,准备写入
fw = open(r'D:\git\ceshi.txt.bak', "w", encoding="UTF-8")
\# for循环读取文件
for line in fr:
    line = line.strip() # 使用for循环逐行读取文件.在每次循环开始时,使用strip()方法去除行首尾的空白字符。
    \# 判断内容,将满足的内容写出
    splitted_line = line.split(",") # 将当前行使用逗号分割,并将结果存储在 splitted_line 变量中。
    if len(splitted_line) >= 5 and splitted_line[4] == "测试":
        # 如果列表的长度大于等于5,并且第五个元素为 “测试
        continue  # 若满足条件,则使用 continue 关键字跳过当前行,继续下一次循环。
    \# 将内容写出去
    fw.write(line) # 如果条件不满足,将当前行写入 ceshi.txt.bak 文件中,并在行末尾手动添加换行符。
    \# 由于前面对内容进行了strip()的操作,所以要手动的写出换行符
    fw.write("\n")
\# 关闭文件对象
fr.close()
fw.close()  # 写出文件调用close()会自动flush()

运行结果如下图:

image-20230805083930381

6 文件中路径的表达

6.1 绝对路径

一级一级将文件的路径表达出来(中国--->山东省--->青岛市--->黄岛区)

r'D:\git\u204\coal_press\stope_class\workface\text\zk_json.txt'
6.2 相对路径

相对路径是指相对于当前工作目录或者当前文件所在目录的文件或目录的路径。相对路径不包含完整的磁盘路径或根目录,而是通过引用相对于当前位置的路径片段来定位文件或目录。

(1)代码文件和 zk_json.txt 文件位于同一个目录中,可以使用以下代码:

file_name = 'zk_json.txt'
file_path = os.path.join(os.path.dirname(__file__), file_name)
image-20230805151234126

(2)文件 zk_json.txt 不在代码文件的同一目录下,而是在相对路径的某个子目录中,可以使用以下方式进行更改:

# 相对路径的子目录名为 text
file_name = 'text/zk_json.txt'
file_path = os.path.join(os.path.dirname(__file__), file_name)
image-20230805085750081

(3)文件 zk_json.txt 不在代码文件的同一目录下,而是在相对路径的某个上级目录中,可以使用"…/"来表示上级目录。这里,"…/"表示返回上级目录一级。如果要返回更多级的上级目录,可以使用"…/…/""…/…/…/"等。根据你的实际目录结构,相应地调整相对路径的级别和文件名。

file_path = "../zk_json.txt"
file_path = os.path.join(os.path.dirname(__file__), file_name)

文本文件在代码的上级目录中的路径使用

image-20230805151733467

文本文件在代码的上上级目录中的路径使用

image-20230805153243833
posted @   凯璇  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示