Python - 文件部分

发布于:2025-05-27 ⋅ 阅读:(21) ⋅ 点赞:(0)

- 第 101 篇 -
Date: 2025 - 05 - 26
Author: 郑龙浩/仟墨

Python - 文件部分

学习时间: 2025-05-19

一 文件与路径

1 文本文件

  • 可以使用 文本编辑软件 查看的文件
  • 本质上还是二进制文件
  • C 的源文件,Python 的源文件 也是文本文件
  • \r 表示回车
  • \n 表示换行

2 二进制文件

  • 保存的内容不可直接给人阅读,而是使用提供的 其他专门的 软件 内容才能让人看懂

    比如要看图片,要用专门的软件打开 图片阅读文件,音频和视频同理

  • Eg: 图片文件、音频文件、视频文件…

  • 二进制文件不能直接使用 文本文件软件 进行查看,比如不能使用 记事本 直接打开图片或者视频,否则会乱码

3 编码格式

① 常见编码格式

  • ASCII: 最早的编码,只能表示英文字符和一些特殊符号
  • UTF-8: 最常用的Unicode编码,可以表示几乎所有语言的字符
  • GBK: 中文编码,主要用于简体中文
  • ISO-8859-1: 西欧语言编码

② 指定编码格式

在Python中打开文件时,可以通过encoding参数指定编码格式:

# 以UTF-8编码打开文件
file = open("example.txt", "r", encoding="utf-8")

# 以GBK编码打开文件
file = open("example.txt", "r", encoding="gbk")

③ 最佳格式

  • 推荐使用UTF-8编码,它是跨平台、跨语言的最佳选择

  • 在Python文件开头添加编码声明:

    # -*- coding: utf-8 -*-
    

④ 处理编码错误

# 忽略无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
    content = f.read()

# 替换无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
    content = f.read()

4 绝对路径

路径分为绝对路径、相对路径

  • 绝对路径:从文件系统的根目录开始的完整路径

    C:\Users\Name\Documents\file.txt
    在Python读取的时候斜杠要反着来
    C:/Users/Name/Documents/file.txt
    

5 相对路径

基本写法

  • file.txt - 当前目录下的文件
  • data/file.txt - 当前目录的data子目录中的文件
  • ./config.ini - 显式表示当前目录下的文件(等同于config.ini

返回上级目录

  • ../ - 返回上一级目录
    • ../settings.ini - 上级目录中的文件
    • ../../file.txt - 上两级目录中的文件

组合路径

  • ../logs/app.log - 上级目录的logs子目录中的文件
  • ./../shared/data.txt - 先当前目录,再上级,然后进入shared目录

二 操作文件的函数和方法

Python 中操作文件需要记住1个函数和3个方法

函数方法 说明
函数 open 打开文件,并且返回文件操作对象
方法 read 将文件内容读取到内存
方法 write 将指定内容写入文件
方法 close 关闭文件
方法 find 查找内容,返回索引

三 操作文件基本套路

  1. 打开文件

    open函数的第一个参数是要打开的文件名(文件名区分大小写)

    • 如果文件存在,返回文件操作对象
    • 如果文件不存在,会抛出异常
  2. 读、写文件

    • 读:将文件内容读入内存

      read方法可以一次性读入返回文件的所有内容

    • 写:将内存内存写入文件

      write

  3. 关闭文件

    close方法负责关闭文件

    • 如果忘记关闭文件,会造成系统资源耗尽,而且会影响到后续对文件的访问
    • 方法执行后,会把文件指针移动到文件的末尾

三个步骤

# 1 打开文件
file = open("文件路径", '打开方式', encoding='文件编码')
# 2 读取
text = file.read()
# 3 关闭
file.close() # 千万不要忘记关闭文件

四 文件指针

1 文件指针的基本介绍

  • 文件指针标记从哪个位置开始读取数据

  • 第一次打开文件的时候,通常文件指针会之指向文件的开始位置

  • 当执行了 read 方法后,文件指针会移动到读取内容的末尾

    默认情况下会移动到 文件末尾

2 注意:第二次调用 read 方法的时候读取不到内容

  • 如果执行了一次 read 方法,读取了所有的内容,那么再次调用 read 方法的时候,不可以获取到内容!!!!
  • 因为 第一次读取之后,文件指针移动到了文件的末尾,再次调用的时候是从文件的末尾开始读取的,所以不会读取到任何的内容

3 seek(offset, whence)tell()

  • seek(offset, whence):移动文件指针
    • whence=0:从文件开头计算(默认)
    • whence=1:从当前位置计算
    • whence=2:从文件末尾计算
  • tell():返回当前文件指针位置
with open('file.txt', 'r') as f:
    print(f.tell())  # 输出:0
    f.seek(5)  # 移动到第5个字节
    print(f.tell())  # 输出:5

五 打开文件的方式

1 基本语法

open 函数默认以 只读方式 打开文件,并且返回文件对象

file = open("文件路径", "访问方式", "文件编码")

2 访问方式

  • 如果只需要读的话,第二个参数可以不用写
访问方式 说明
r 只读 的方式打开文件。如果文件存在,文件指针将会放在文件的开头,这是默认模式。如果文件不存在,会抛出异常
w 只写 的方式打开文件。如果文件存在,如果写入,文件内容会被覆盖。如果文件不存在,创建新的文件
a 追加 的方式打开文件。如果文件存在,文件指针将会放在文件的结尾。如果文件不存在,创建新的文件进行写入
r+ 读写 的方式打开文件。如果文件存在,文件指针将会放在文件的开头。如果文件不存在,会抛出异常
w+ 读写 的方式打开文件。如果文件存在,如果写入,文件内容会被覆盖。如果文件不存在,创建新的文件进行写入
a+ 读写 的方式打开文件。如果文件存在,文件指针将会放在文件的结尾。如果文件不存在,创建新的文件进行写入

频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件

六 读取文件内容

(1)一次性读取文件内容

# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r')  效果是等效的

test = file.read() 
print(test)
# 关闭文件(必须执行)
file.close()

# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb

(2)readline按行读取文件内容

1 前言

  • read 方法默认会把文件的 所有内容一次性读取到内存
  • 如果文件太大,对内存的占用会非常严重

2 readline 方法

  • readline方法可以一次读取一行的内容
  • readline方法执行后,会把 文件指针 移动到 下一行,准备下次读取
  • readline方法可以利用循环也可以把一个很大的文件一次性读取出来

“源文件”文件

1234567
abcde
aaaaa
bbbbbbbbb

test1.py文件

# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r')  效果是等效的
while True:
    # 每次循环,读取一行
    test = file.readline() # 如果读取到末尾的时候,返回空字符串''
    # 判断是否读取到内容  如果文件指针指向结尾,则braek
    if not test: # 如果 not '' 则为 True
        break
    print(test, end = '')
# 关闭文件(必须执行)
file.close()

# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb

(3)使用for lline int file遍历文件内容

# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r')  效果是等效的
for line in file:
    print(line, end = '') # 如果写的是 print(line) 会每一行下面多打印行空格,因为print会自动打印一行空格
# 关闭文件(必须执行)
file.close()

# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb

(4)read(n)readline(n) 可以写参数,n表示读取多少个字符

file.read(5)只打印前5个字符

# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r')  效果是等效的

test = file.read(5)  # 只打印前5行
print(test)
# 关闭文件(必须执行)
file.close()

# 打印结果
12345

七 文件复制

1 小文件复制

(1 )步骤

  1. 打开源文件和目标文件
    • 源文件以只读方式打开
    • 目标文件以只写方式打开
  2. 将原文件的中的内容读取出来
  3. 将读取出来的内容写入到目标文件
  4. 关闭两个文件

(2 )具体实现

源文件

1234567
abcde
aaaaa
bbbbbbbbb

目标文件

复制以后,该文件内容与源文件相同

test2.py

# 1 打开文件
file_read = open('源文件')
file_write = open('目标文件', 'w')
# 2 读写文件
text = file_read.read()
text2 = file_write.write(text)
# 3 关闭打开的
file_read.close()
file_write.close()

2 大文件复制

因为文件太大,如果一次性读取出来的话会占用大量的内存空间,所以分行复制,一行一行的复制

(1)步骤

  1. 打开源文件和目标文件
    • 源文件以只读方式打开
    • 目标文件以只写方式打开
  2. 按照一行一行的形式将源文件中的内容复制到目标文件当中去
  3. 关闭两个文件

(2)具体实现

# 1 打开文件
file_read = open('源文件')
file_write = open('目标文件', 'w')
# 2 读写文件
while True:
    # 读取一行内容
    text = file_read.readline()
    # 文件指针指向末尾,退出循环
    if not text:
        break
    text2 = file_write.write(text)
# 3 关闭打开的
file_read.close()
file_write.close()

八 文件/目录的常用管理操作

1 基本介绍

  • 在终端/文件浏览器中可以执行常规的 文件 / 目录 管理操作,例如:

    创建、重命名、删除、改变路径、查看目录内容…

  • Python中,如果用上面的功能的话,需要导入 os 模块

2 文件操作

方法名 说明 例子
rename 重命名文件 os.rename(源文件名,目标文件名)
remove 删除文件 os.remove(文件名)

3 目录操作

如下操作中,文件或者目录操作都支持 相对路径绝对路径

方法名 说明 例子
listdir 目标列表 os.listdir(目标名)
mikdir 创建目录 os.mikdir(目标名)
rmdir 删除目录 os.rmdir(目标名)
getcwd 获取当前目录 os.getcwd()
chdir 修改工作目录 os.chdir(目标目录)
path.isdir 判断是否是文件 os.path.isdir(文件路径)

九 自动关闭文件的方法

只要离开了缩进范围,就自动关闭了

1 打开一个文件

可以不手动写 close 方法关闭文件

with open('test.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
# 文件已自动关闭

2 同时打开多个文件

with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
    data = infile.read()
    outfile.write(data.upper())
# 两个文件都已自动关闭

十 文件刷新

一般来说不需要手动刷新

下面三种情况需要

  • 实时日志记录:如果程序可能崩溃,希望日志立即写入硬盘,而不是一直在内存缓冲区

    with open("debug.log", "a") as f:
        f.write("Error: something went wrong!\n")
        f.flush()  # 确保日志立即写入,即使程序崩溃
    
  • 长时间运行的文件写入:如果文件长时间不关闭,但希望内容尽快写入硬盘。

    也就是如果大文件需要分批次写入,就需要每隔一段时间就刷新一次。

    file = open("data.txt", "w")
    for i in range(1000000):
        file.write(f"Line {i}\n")
        if i % 1000 == 0:
            file.flush()  # 每1000行刷一次,避免内存占用过高
    file.close()
    
  • 多进程/多线程共享文件:如果另一个进程需要立即读取刚写入的内容,但文件尚未关闭

下面的情况不需要手动刷新

  • 正常情况:用 with 语句或正确调用了 close(),数据一定会写入硬盘,无需手动 flush()
  • 小文件写入:如果写入的数据量小,缓冲区很快填满,系统会自动刷新。
  • 程序正常退出:Python 在程序结束时会自动刷新所有缓冲区

刷新步骤

# 1 打开文件
file = open("XX")
# 2 读取
text = file.read()
# 3 刷新
flie.flush()
# 4 关闭
file.close() # 千万不要忘记关闭文件

网站公告

今日签到

点亮在社区的每一天
去签到