【新人系列】Python 入门(十四):文件操作

news2025/1/12 21:35:18

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪

Python 中对文件的操作有很多种常见的操作包括创建、删除、修改权限、读取、写入等这些操作可大致分为以下 2 类:

  • 删除、修改权限:作用于文件本身属于系统级操作。
  • 写入、读取:是文件最常用的操作作用于文件的内容属于应用级操作。

文件的应用级操作可以分为以下 3 步每一步都需要借助对应的函数实现:

  • 打开文件:使用 open( ) 函数该函数会返回一个文件对象。
  • 对已打开文件做读/写操作:读取文件内容可使用 read( )、readline( ) 以及 readlines( ) 函数;向文件中写入内容可以使用 write( ) 函数。
  • 关闭文件:完成对文件的读/写操作之后最后需要关闭文件可以使用 close( ) 函数。

1. 创建 / 打开文件

1.1 基本语法

open( ) 函数用于创建或打开指定文件该函数的常用语法格式下:

file = open(file_name [,mode='r' [,buffering=-1 [,encoding=None] ] ])

此格式中用 [ ] 括起来的部分为可选参数。其中常用参数所代表的含义如下:

  • file:表示要创建的文件对象。
  • file_name:要创建或打开文件的文件名称该名称要用引(单引号或双引号都可以)括起来。
  • mode:可选参数用于指定文件的打开模式,如果不写则默认以只读(r)模式打开文件。
  • encoding:手动设定打开文件时所使用的编码格式不同平台的 ecoding 参数值也不同以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。

open 函数支持的文件打开模式:

在这里插入图片描述

1.2 上下文管理器

有时候我们 open 完文件后,可能会忘记关闭文件。而在 Python 中,使用 with as 语句可以操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。

with as 语句的基本语法格式为:

with 表达式 [as target]:
    代码块

此格式中,用 [ ] 括起来的部分可以使用,也可以省略。其中,target 参数用于指定一个变量,该语句会将 expression 指定的结果保存到该变量中。

with open('open_file.txt', 'r') as f:
    print(f.read())

2. 读取文件

Python 提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:

  • read( ) 函数:逐个字节或者字符读取文件中的内容
  • readline( ) 函数:逐行读取文件中的内容
  • readlines( ) 函数:一次性读取文件中多行内容

3.1 read( ) 函数

read( ) 函数的基本语法格式如下:

file.read([size])

其中,file 表示已打开的文件对象;size 作为一个可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。

示例 1:读取文本

# open_file.txt
hello world1
hello world2
hello world3

# test.py - 读取1
f = open("open_file.txt", 'r')
print(f.read())     # 不指定字节数则默认全部读取出来
f.close()

# test.py - 读取2
f = open("open_file.txt", 'r')
print(f.read(5))     # hello
print(f.read(5))     #  worl
f.close()

示例 2:读取图片

# 以二进制形式打开指定文件
f = open("pic.png", 'rb')
print(f.read())    # 会输出字节流形式的数据

示例 3:rstrip 消除

我们还可以将 open 的文件或 read 读取到的数据赋值给一个变量,然后通过这个变量进行操作。

f = open("open_file.txt", 'r')
contents = f.read()
print(contents.rstrip())   #rstrip()用于消除原始结果后会空出的一行
f.close()

read( ) 函数抛出 UnicodeDecodeError 异常的解决方法

在使用 read( ) 函数时,如果 Python 解释器提示 UnicodeDecodeeError 异常或者显示为乱码,其原因在于目标文件使用的编码格式和 open( ) 函数打开该文件时使用的编码格式不匹配。

例如现在我有一段脚本用来获取并打印 ping www.baidu.com 返回的数据信息。

import subprocess

if __name__ == '__main__':
    shell_cmd = 'ping www.baidu.com'
    p = subprocess.Popen(shell_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while p.poll() is None:
        line = p.stdout.readline()
        line = line.strip()
        if line:
            print(line)
    if p.returncode == 0:
        print('Subprogram success')
    else:
        print('Subprogram failed')

我们在 cmd 中 ping 这个网址,就会返回一些数据信息:

在这里插入图片描述

但是我们运行上面的脚本打印出来的信息确实一些字节流,看不懂什么意思。

在这里插入图片描述

这就需要我们对返回的数据进行解码操作,我先尝试用 utf-8 进行解码。

import subprocess

if __name__ == '__main__':
    shell_cmd = 'ping www.baidu.com'
    p = subprocess.Popen(shell_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while p.poll() is None:
        line = p.stdout.readline()
        line = line.strip()
        if line:
            line = line.decode('utf-8')
            print(line)
    if p.returncode == 0:
        print('Subprogram success')
    else:
        print('Subprogram failed')

却发现运行时返回了 UnicodeDecodeeError 的异常。

在这里插入图片描述

这是因为返回的数据格式不是 utf-8,即编码格式不匹配。因此,我们可以使用 chardet 库中的 detect 检测函数来检测返回的数据的编码格式是什么。

import subprocess
import chardet

if __name__ == '__main__':
    shell_cmd = 'ping www.baidu.com'
    p = subprocess.Popen(shell_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while p.poll() is None:
        line = p.stdout.readline()
        line = line.strip()
        if line:
            print(chardet.detect(line))
            print(line)
    if p.returncode == 0:
        print('Subprogram success')
    else:
        print('Subprogram failed')

这时候我们就可以获取到返回数据的编码格式,即为 GB2312 格式。

在这里插入图片描述

因此,我们在解码的时候指定用 GB2312 格式即可返回解码成功后的数据。

import subprocess

if __name__ == '__main__':
    shell_cmd = 'ping www.baidu.com'
    p = subprocess.Popen(shell_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while p.poll() is None:
        line = p.stdout.readline()
        line = line.strip()
        if line:
            line = line.decode('GB2312')
            print(line)
    if p.returncode == 0:
        print('Subprogram success')
    else:
        print('Subprogram failed')

在这里插入图片描述

2.2 readline( ) 函数

readline( ) 函数用于读取文件中的一行,包含最后的换行符 “\n”。此函数的基本语法格式为:

file.readline([size])

其中,file 为打开的文件对象;size 为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。

f = open("open_file.txt")
print(f.readline())
print(f.readline())
f.close()

在这里插入图片描述

如果不想打印出空行,则可以在后面通过 end 指定结尾不是换行符。

f = open("open_file.txt")
print(f.readline(), end='')
print(f.readline(), end='')
f.close()

在这里插入图片描述

注意 readline 中传入的参数不是指定读取的行数,而是字节数。

f = open("open_file.txt")
print(f.readline(3), end='')    # hel
f.close()

另外,我们也可以通过 for 循环遍历获取文件中的每行数据。

filename = 'open_file.txt'
f = open(filename)
for line in f:
    print(line.rstrip())    #rstrip()可以消除原始结果每行后的空白行
f.close()

2.3 readlines( ) 函数

readlines( ) 函数用于读取文件中的所有行,它和调用不指定 size 参数的 read( ) 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。

readlines( ) 函数的基本语法格式如下:

file.readlines()

其中,file 为打开的文件对象。和 read( )、readline( ) 函数一样,它要求打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 4 种)。

f = open("open_file.txt")
print(f.readlines())    # ['hello world1\n', 'hello world2\n', 'hello world3']
f.close()

2.4 读取大文件

Python 读取文件一般是利用 open( ) 函数以及 read( ) 函数来完成,但该方式仅适合读取小文件。因为调用 read( ) 会一次性读取文件的全部内容,调用 readlines( ) 一次读取所有内容并按行返回 list。如果文件过大,如 10G,会造成 MemoryError 内存溢出,正确的做法:可以反复调用 read(size) 方法,每次指定读取 size 个字节的内容。

处理大文件核心思路: 通过参数指定每次读取的大小长度,这样就避免了因为文件太大读取出问题。

while True:
    block = f.read(1024)
    if not block:
        break

2.5 fileinput 模块

Python 提供了 fileinput 模块,通过该模块中的 input( ) 函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。

fileinput 模块中 input( ) 该函数的语法格式如下:

fileinput.input (files="filename1, filename2, ...", inplace=Faise, backup=", bufsize=0, mode='r', openhook=None)

其中,各个参数的含义如下:

  • files:多个文件的路径列表。
  • inplace:用于指定是否将标准输出的结果写回到文件,此参数默认值为 False。
  • backup:用于指定备份文件的扩展名。
  • bufsize:指定缓冲区的大小,默认为 0。
  • mode:打开文件的格式,默认为 r(只读格式)。
  • openhook:控制文件的打开方式,例如编码格式等。
import fileinput

# 常规读取当个文件
for line in fileinput.input('open_file.txt'):
    print(line, end='')

# 读取多个文件 - 先读取完test01.txt再读取test02.txt
for line in fileinput.input(files=('test01.txt', 'test02.txt')):
    print(line, end='')

如果我们对文件进行修改,例如下面将 open_file.txt 里的数据转换为大写字母,则可以通过 backup 参数对文件进行备份。下面在修改完 open_file.txt 里面的数据后,也会同时生成一个 open_file.txt.bak 的文件,存储修改之前的数据,避免一些误操作导致文件被破坏。

import fileinput

# 对文件进行处理并进行备份,并且转换为大写
for line in fileinput.input('open_file.txt', backup='.bak', inplace=True):
    print(line.upper(), end='')

2.6 linecache 模块

除了可以借助 fileinput 模块实现读取多个文件外,Python 还提供了 linecache 模块。和前者不同,linecache 模块擅长读取指定文件中的指定行。

换句话说,如果我们想读取某个文件中指定行包含的数据,就可以使用 linecache 模块。

import linecache
import string

# 读取string模块中第3行的数据
print(linecache.getline(string.__file__,3), end='')     # Public module variables:

# 读取普通文件open_file.txt文件中第2行的数据
print(linecache.getline('open_file.txt', 2), end='')    # HELLO WORLD2

3. 写文件

我们再回顾一下上面的内容,调用 open( ) 时提供两个实参,第一个是要打开的文件的名称,第二个则是告诉 Python 进行的模式,常见模式为读取模式(‘r’)、写入模式(‘w’ )、附加模式(‘a’)或读写模式(‘r+’)。如果省略了模式实参,Python 将以默认的只读模式打开文件。

Tips:
写入模式会再返回文件对象前清空该文件的内容,如果想在文件后直接添加内容而不是覆盖原有的内容,可以以附加模式打开文件。

3.1 write( ) 函数

Python 中的文件对象提供了 write( ) 函数,可以向文件中写入指定内容。

该函数的语法格式如下:

file.write(string)

其中:

  • file 表示已经打开的文件对象
  • string 表示要写入的字符串
f = open("test01.txt", 'w')
f.write("hello world1\n")
f.write("hello world2\n")
f.write("hello world3\n")
f.close()

3.2 writelines( ) 函数

Python 的文件对象中,不仅提供了 write( ) 函数,还提供了 writeliines( ) 函数,可以实现将字符串列表写入文件中。一般配合着 readlines( ) 函数使用,可以快速的将文件中的数据复制到其它文件中。

f_r = open("test01.txt", 'r')
list1 = f_r.readlines()

f_w = open("test02.txt", 'w')
f_w.writelines(list1)

Tips:
Python 只能将字符串写入文本文件,如果要将数值数据存储到文本文件中,必须先使用函数 str( ) 将其转换为字符串格式。

3.3 json.dump( ) 和 json.load( )

  1. json.dump( )

在 Python 中,json.dump() 函数用于将数据对象序列化为 JSON 格式并将其写入文件。例如,下面我们可以将 numbers 列表存储于 numbers.json 文件中。

import json
numbers = [2,3,5,7,11,13]
filename = 'numbers.json'
with open(filename, 'w') as f:
    json.dump(numbers, f)
  1. json.load( )

json.load() 函数则用于从文件中读取 JSON 格式的数据并将其反序列化为 Python 对象。例如,下面我又将刚才存入 numbers.json 中的数据读取出来。

import json
filename = 'numbers.json'
with open(filename) as f:
    numbers = json.load(f)
print(numbers)

4. 文件指针

实现对文件指针的移动,文件对象提供了 tell( ) 函数和 seek( ) 函数。tell( ) 函数用于判断文件指针当前所处的位置,而 seek( ) 函数用于移动文件指针到文件的指定位置。

在这里插入图片描述

  1. tell( ) 函数

由于 read 函数每次调用完后,文件的指针会停留在当前读取完的数据的位置,下次再次读取时会从上次读取完的位置继续读取。而通过 tell( ) 函数可以判断当前指针处于哪个位置,tell( ) 函数的用法很简单,其基本语法格式如下:

file.tell()

现在我通过 read 函数分别读取 1 个字节以及 2 个字节的数据,然后调用 tell 函数可以发现当前文件的指针停留在了第 3 个字节的位置。

f = open('open_file.txt', 'r')
print(f.read(1))
print(f.read(2))
print(f.tell())  # 判断文件指针的位置

在这里插入图片描述

  1. seek( ) 函数

上面可知,文件读取完后指针不会重置,因此下次想从头或者其它位置开始读取,则可以使用 seek( ) 函数将文件指针移动至指定位置,该函数的语法格式如下:

file.seek(offset[, whence])

接着上面的案例,我们可以通过 seek 函数将函数指针移至开头的位置,这样下次读取时又会从头开始读取。

f = open('open_file.txt', 'r')
print(f.read(1))
print(f.read(2))
print(f.tell())  # 判断文件指针的位置
f.seek(0)
print(f.read(1))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。 前提条件 在开始之前,请确保您已安装以下内容: Qt(版本 5.15 )OGRE(版本14.2.5)…

丹摩 | 利用 CogVideoX 生成视频

声明:非广告,纯用户体验 1. CogVideoX CogVideoX 是智谱 AI 推出的一款极具创新性与突破性的视频生成产品。它在技术层面展现出诸多卓越特性,例如其采用的 Diffusion Transformer(DiT)架构奠定了强大的生成能力基础…

本地化部署 私有化大语言模型

本地化部署 私有化大语言模型 本地化部署 私有化大语言模型Anaconda 环境搭建运行 代码概述环境配置安装依赖CUDA 环境配置 系统设计与实现文件处理与加载文档索引构建模型加载与推理文件上传与索引更新实时对话与文档检索Gradio 前端设计 主要功能完整代码功能说明运行示例文件…

05_JavaScript注释与常见输出方式

JavaScript注释与常见输出方式 JavaScript注释 源码中注释是不被引擎所解释的,它的作用是对代码进行解释。lavascript 提供两种注释的写法:一种是单行注释,用//起头:另一种是多行注释,放在/*和*/之间。 //这是单行注释/* 这是 多行 注释 *…

python常见问题-pycharm无法导入三方库

1.运行环境 python版本:Python 3.9.6 需导入的greenlet版本:greenlet 3.1.1 2.当前的问题 由于需要使用到greenlet三方库,所以进行了导入,以下是我个人导入时的全过程 ①首先尝试了第1种导入方式:使用pycharm进行…

vue3实现自定义导航菜单

一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…

多模态图像生成模型Qwen2vl-Flux,利用Qwen2VL的视觉语言理解能力增强FLUX,可集成ControlNet

Qwen2vl-Flux 是一种先进的多模态图像生成模型,它利用 Qwen2VL 的视觉语言理解能力增强了 FLUX。该模型擅长根据文本提示和视觉参考生成高质量图像,提供卓越的多模态理解和控制。让 FLUX 的多模态图像理解和提示词理解变得很强。 Qwen2vl-Flux有以下特点…

原生html+css+ajax+php图片压缩后替换原input=file上传

当前大部分照片尺寸大于5MB&#xff0c;而50MB限制的PHP通常上传4MB左右 于是就需要压缩后上传&#xff0c;上5代码使用后筛选的代码 <?php if ($_SERVER[REQUEST_METHOD] POST) { $uploadDir uploads/ . date(Ymd) . /; if (!is_dir($uploadDir)) { mkdir($uploadDir, …

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器&#xff0c;也就是Flash启动10系统存储器系统存储器启动&#xff0c;串口下载11SRAM启动SRAM启动&#xff0c;用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时&#xff0c;就是下载…

泷羽sec学习打卡-shell命令4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell4 如何在shell脚本与用户进行交互&#xff1f;如何限制用户输入的字符个数呢…

电子应用设计方案-27:智能淋浴系统方案设计

智能淋浴系统方案设计 一、系统概述 本智能淋浴系统旨在为用户提供舒适、便捷、个性化的淋浴体验&#xff0c;通过集成多种智能技术&#xff0c;实现水温、水流、淋浴模式的精准控制以及与其他智能家居设备的联动。 二、系统组成 1. 喷头及淋浴杆 - 采用可调节角度和高度的设计…

Spring系列之批处理Spring Batch介绍

概述 官网&#xff0c;GitHub A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems. 执行流程 实战 假设有个待处理的任务&#xff0c;如文件batch-tes…

内存共享模型和Actor 模型

内存共享模型&#xff1a; 典型代表&#xff1a;java Actor 模型&#xff1a; 典型代表&#xff1a;HamnoyOS API 13

机器学习期末复习笔记

markdown文件下载&#xff1a;https://github.com/1037827920/SCUT-Notes/tree/main/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0 机器学习期末复习笔记 1. 机器学习简介 1.1 什么是机器学习 如图所示&#xff1a; 几乎所有的机器学习都包括以下三个部分&#xff1a;数据、模型和…

Spring Boot拦截器(Interceptor)详解

拦截器Interceptor 拦截器我们主要分为三个方面进行讲解&#xff1a; 介绍下什么是拦截器&#xff0c;并通过快速入门程序上手拦截器拦截器的使用细节通过拦截器Interceptor完成登录校验功能 1. 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数&#xff1a; lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数&#xff1a; lambda 1&#xff09;语法&#xff1a; lambda arg1, arg2, …, argN : expression using arg 2&#xff09; lambda是一个表达式&#xff0c;而不是一个语…

【SpringBoot】Spring Data Redis的环境搭建(win10)

启动redis服务 进入redis安装目录&#xff0c;启动cmd Redis客户端连接redis服务 我用的redis客户端是github上一个大佬写的&#xff0c;叫 Another Redis Desktop Manager Java框架操作Redis 框架有很多&#xff0c;比如Jedis&#xff0c;Spring Data Redis&#xff0c;Let…

联想品牌的电脑 Bios 快捷键是什么?如何进入 Bios 设置?

在某些情况下&#xff0c;您可能需要通过U盘来安装操作系统或进行系统修复。对于联想电脑用户来说&#xff0c;了解如何设置U盘作为启动设备是非常有用的技能之一。本文简鹿办公将指导您如何使用联想电脑的 U 盘启动快捷键来实现这一目标。 联想笔记本 对于大多数联想笔记本电…

51单片机教程(九)- 数码管的动态显示

1、项目分析 通过演示数码管动态显示的操作过程。 2、技术准备 1、 数码管动态显示 4个1位数码管和单片机如何连接 a、静态显示的连接方式 优点&#xff1a;不需要动态刷新&#xff1b;缺点&#xff1a;占用IO口线多。 b、动态显示的连接方式 连接&#xff1a;所有位数码…

windows下安装node.js和pnpm

首先&#xff0c;一定要powershell右键选择管理员身份运行&#xff0c;否则第三个命令报错。 # 安装 fnm (快速 Node 管理器) winget install Schniz.fnm# 配置 fnm 环境 fnm env --use-on-cd | Out-String | Invoke-Expression# 下载并安装 Node.js fnm use --install-if-mis…