python中的文件操作

文件操作步骤

在Python中,文件操作主要涉及打开、读取、写入和关闭文件。这是一门基础且重要的技能,因为它使得程序能够持久化数据,或者处理磁盘上的数据文件。Python提供了一个内建的open函数用于文件的打开,以及文件对象提供的方法用于读取和写入。

打开文件

使用open函数打开文件时,可以指定文件的路径和模式。模式指定了文件是用于读取、写入还是追加,以及文件是文本模式还是二进制模式。

file = open('test20.txt', 'r')  # 'r'表示读取模式

注意!r模式如果文件不存在会报错:

FileNotFoundError: [Errno 2] No such file or directory: './data/test22.txt'

读取文件

打开文件后,可以使用read, readlinereadlines方法来读取文件内容。

content = file.read()  # 读取整个文件
line = file.readline()  # 读取下一行
lines = file.readlines()  # 读取所有行到一个列表

写入文件

要写入文件,首先需要以写入(‘w’)或追加(‘a’)模式打开文件。然后可以使用writewritelines方法写入数据。

  • 当以写入(‘w’)模式打开文件时,如果文件已存在,则其内容会被覆盖。如果想要保留原有内容,请考虑使用追加(‘a’)模式。
  • 在处理非文本数据(如图片或视频)时,请确保以二进制模式(‘b’)打开文件(例如 ‘rb’ 或 ‘wb’ 或 ‘ab’)。
file = open('example.txt', 'w')  # 'w'表示写入模式,会覆盖原有内容
file.write('Hello, world!\n')  # 写入字符串
file.writelines(['Hello, world!\n', 'Another line\n'])  # 写入一个字符串列表

关闭文件

完成文件操作后,应该使用close方法关闭文件,以释放系统资源。

file.close()

使用with语句

为了确保文件正确关闭,推荐使用with语句管理文件上下文。这样,文件操作完成后,文件会自动关闭。

with open('./data/test20.txt', 'w') as file:content = file.read()with open("./data/test20.txt", 'r') as file:print(file.read())with open("./data/test20.txt", 'a') as file:file.write("aaaa\n")
  • 使用with语句可以自动管理文件资源,无论是正常结束还是发生异常都能保证文件正确关闭。这比手动调用close()方法更为安全和方便。
  • 如果没有正确关闭文件,可能会导致资源泄露或数据未被完全写入磁盘。

open方法

由于open函数是Python的内置函数,其实现依赖于CPython的底层代码,通常是用C语言编写的。因此,直接查看open函数的"源码注释"可能不像查看纯Python代码那样直观。在此基于Python官方文档和一般理解来解释open函数的功能和用法。

请注意,在实际应用中很少需要深入到源代码级别去理解内置函数如open()之类功能性细节;官方文档提供了充分、准确地信息来指导日常使用。

日常使用关注file和mode两个参数即可

在Python中,open()函数用于打开一个文件,并且返回一个文件对象。通过这个文件对象,你可以进行读取、写入等操作。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file: 必须参数。文件路径(相对或绝对路径)。

  • mode: 可选参数,默认为’r’。mode参数在open函数中定义了文件应该以什么模式被打开,这包括文件是用于读取、写入还是追加,以及文件是以文本模式还是二进制模式处理。下面是mode参数的一些常用选项及其含义:

    • 'r': 读取模式(默认)。如果文件不存在,抛出FileNotFoundError
    • 'w': 写入模式。如果文件存在,将其覆盖;如果文件不存在,创建新文件。
    • 'x': 排他性创建模式。如果文件存在,操作将失败。
    • 'a': 追加模式。如果文件存在,将写入的数据追加到文件末尾;如果文件不存在,创建新文件。
    • 'b': 二进制模式。添加到其他模式中(如'rb', 'wb', 'ab')以处理二进制文件,如图片、视频等。
    • 't': 文本模式(默认)。添加到其他模式中(如'rt', 'wt', 'at')以处理文本文件。文本模式与二进制模式的主要区别在于,文本模式会自动处理平台特定的行结束符。
    • '+': 更新模式,用于读取和写入。可以与其他模式结合使用(如'r+', 'w+', 'a+'),使文件同时支持读写操作。

    这些模式可以组合使用,例如:

    • 'rb''wb' 用于二进制文件的读写。
    • 'r+' 表示打开文件用于读写,文件指针放在文件的开头。
    • 'w+' 表示打开文件用于读写,如果文件存在则覆盖,不存在则创建。
    • 'a+' 表示打开文件用于读写,如果文件存在,文件指针将会放在文件的结尾,也就是说新的内容将会被追加到文件的末尾。

    选择正确的模式对于执行期望的文件操作非常重要,不正确的模式可能导致数据丢失或文件损坏。

  • buffering: 设置缓冲策略,默认为-1代表使用系统默认缓冲策略;0代表不缓冲;大于1的整数n代表使用指定大小n的缓冲区。

  • encoding: 用于解码或编码文件的编码方式。这对文本模式特别重要。

  • errors: 指定如何处理编码和解码错误 - 它们通常发生在文本数据处理中。

  • newline: 控制换行符在输入输出时如何被处理。

  • closefd: 如果file是一个描述符,则该选项为False时描述符将不会被关闭。

  • opener: 通过自定义开启器来打开底层文件描述符。

注意事项

1. 文件路径

  • 跨平台兼容性:不同操作系统的文件路径分隔符不同(Windows使用\,而Linux和macOS使用/)。为了编写可移植代码,请使用os.path.join()或者在字符串前加r(表示原始字符串)来处理文件路径。

    • os.path.join()函数用于以可移植的方式连接一个或多个路径部分。这个函数会根据你的操作系统自动处理文件路径中的分隔符。在Windows系统上,它使用反斜杠\作为路径分隔符,而在Linux和macOS上,它使用正斜杠/

      这里是一个简单的示例:

      import os# 假设我们要构建一个指向用户主目录下某个子目录中的文件的路径
      user_home = '/Users/fangyirui/PycharmProjects/pythonProject/'  # 在Windows上可能是 'C:\\Users\\username'
      subdirectory = 'data'
      filename = 'test20.txt'# 使用os.path.join()来构建完整路径
      full_path = os.path.join(user_home, subdirectory, filename)print(full_path)
      

      在Linux或macOS上,输出将会是:

      /Users/fangyirui/PycharmProjects/pythonProject/data/test20.txt
      

      而在Windows上,输出将会是:

      C:\Users\username\data\test20.txt
      

      通过使用os.path.join()来构建文件路径,你可以确保你的Python代码能够跨平台运行,无需担心不同操作系统之间在文件路径表示上的差异。

  • 相对路径与绝对路径:推荐使用绝对路径来避免依赖当前工作目录,这样可以减少因工作目录变化导致的错误。

2. 异常处理

  • 在进行文件操作时可能会遇到各种异常(如IOError, FileNotFoundError等),适当地捕获并处理这些异常可以使程序更加健壮。
try:with open('example.txt', 'r') as file:content = file.read()
except FileNotFoundError:print("The file does not exist.")

3. 编码问题

  • 当读取或写入文本文件时,默认的编码方式可能因操作系统而异。为了提高代码的可移植性,在打开文本文件时指定编码是一个好习惯(如 open(file, mode='r', encoding='utf-8'))。

4. 性能考虑

  • 对于大型文件,一次性读取整个内容到内存中可能会导致内存溢出。在这种情况下,逐行读取或使用固定大小的缓冲区来迭代读取数据通常是更好的选择。

练习题:日志文件分析器

需求

假设你有一个日志文件log.txt,其中包含了一个软件每天的运行日志。每条日志以新行开始,格式如下:

[YYYY-MM-DD HH:MM:SS] [LEVEL] Message

例如:

2023-03-01 12:00:00 [INFO] Application start
2023-03-01 12:01:00 [ERROR] An error occurred
2023-03-01 12:02:00 [WARN] Warning message
2023-03-01 12:03:00 [INFO] Application stop
2023-03-01 12:04:00 [ERROR] Another error occurred
2023-03-01 12:05:00 [WARN] Another warning message
2023-03-01 12:06:00 [INFO] Another application stop
2023-03-01 12:07:00 [ERROR] Yet another error occurred
2023-03-01 12:08:00 [WARN] Yet another warning message
2023-03-01 12:09:00 [INFO] Yet another application stop
2023-03-01 12:10:00 [ERROR] Yet another error occurred
2023-03-01 12:11:00 [WARN] Yet another warning message
2023-03-01 12:12:00 [INFO] Yet another application stop
2023-03-01 12:13:00 [ERROR] Yet another error occurred
2023-03-01 12:14:00 [WARN] Yet another warning message

你的任务是编写一个Python脚本,完成以下操作:

  1. 读取日志文件:打开并读取log.txt文件的内容。
  2. 统计日志级别数量:计算文件中每个日志级别(INFO, ERROR, WARN等)的出现次数。
  3. 筛选错误日志:将所有错误级别的日志条目复制到一个新文件errors.txt中。
  4. 生成报告:在控制台输出每个日志级别的数量,并指出最频繁的日志级别。

代码实现

def analyze_log_file(log_file_path):# 初始化计数器log_levels = {"INFO": 0, "ERROR": 0, "WARN": 0}# 打开并读取日志文件with open(log_file_path, 'r') as file:for line in file:# 这里填入代码以更新log_levels字典# 这里填入代码以筛选错误日志并写入errors.txt# 这里填入代码以输出每个日志级别的数量# 这里填入代码以确定并输出最频繁的日志级别# 调用函数
analyze_log_file('log.txt')

完成这个练习将帮助你熟悉文件的读取、写入操作和基本的字符串处理技能。

实现1

def analyze_log_file(log_file_path):# 初始化计数器log_levels = {"INFO": 0, "ERROR": 0, "WARN": 0}# 打开并读取日志文件with open(log_file_path, 'r') as file:lines = file.readlines()# 准备写入错误日志的文件with open('errors.txt', 'w') as error_file:for line in lines:if "[INFO]" in line:log_levels["INFO"] += 1elif "[ERROR]" in line:log_levels["ERROR"] += 1error_file.write(line)  # 将错误日志写入errors.txtelif "[WARN]" in line:log_levels["WARN"] += 1# 输出每个日志级别的数量和最频繁的日志级别print("Log level counts:")for level, count in log_levels.items():print(f"{level}: {count}")most_frequent_level = max(log_levels, key=log_levels.get)print(f"The most frequent log level is: {most_frequent_level}")# 调用函数进行测试
analyze_log_file('log.txt')

实现2

def analyze_log_file(log_file_path):# 初始化计数器log_levels = {"INFO": 0, "ERROR": 0, "WARN": 0}# 打开并读取日志文件with open(log_file_path, 'r') as file:for line in file:# print(line, end='')# 更新log_levels字典if line.__contains__("[INFO]"):log_levels["INFO"] += 1elif line.__contains__("[ERROR]"):log_levels["ERROR"] += 1# 筛选错误日志并写入errors.txtwith open("./data/errors.txt", 'a') as error_file:error_file.write(line)elif line.__contains__("[WARN]"):log_levels["WARN"] += 1# 每个日志级别的数量print(log_levels)# 这里填入代码以确定并输出最频繁的日志级别max_times = max(list(log_levels.values()))# print(max_times)max_logs_level = max(log_levels, key=log_levels.get)print(f"The most frequent log level is: {max_logs_level} , with {max_times} occurrences.")# 调用函数
analyze_log_file('./data/log.txt')

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

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

相关文章

【人工智能】Anthropic发布强大的Claude3对齐GPT-4,大模型杂谈个人感想

北京时间3月5日,人工智能创业公司Anthropic宣布,推出其突破性的Claude 3系列模型。Claude 3系列包含三个子模型,分别为Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus,它们提供不同程度的智能、速度和成本选择,以满足…

【优化方案】Java 将字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果

需求 将输入的字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果,允许存在多个*号。 分析: 在每个星号位置,我们需要进行 0-9 的循环遍历,因此每个星号位置都有 10 种可能性。如果字符数组中有k个星号&#x…

轻松记录收支明细,智慧分析财务情况,一键打印保存!“

在这个信息爆炸的时代,财务管理已成为我们生活中不可或缺的一部分。无论您是家庭主妇、白领上班族还是企业经营者,都需要对自己的财务情况了如指掌。那么,如何轻松记录和分析收支明细,让财务管理变得简单高效呢?今天&a…

Mutex 争用解析

导读 上一篇文章介绍了latch争用的相关内容,本文继续介绍与latch相关的mutex争用的相关内容。 1、Mutex故障排除 查看相关视图v$sessionV$SESSION_WAIT P1,P2,P3值表示library cache 对象在争用状态下的哈希值,即持有mutex的会话。V$event_name和V$ses…

蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx接口处未对用户输入的SQL语句…

Android中get、post、图片下载的类

创建Network公共类 &#xff08;这里面都没有加token&#xff0c;如果需要可以自行添加&#xff09; 添加依赖 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.9 添加网络权限 AndroidManifest.xml里面添加 <uses-pe…

ZCC6983最大充电电流 2A、升压型 3 节锂电池充电管理器

特性 ■ 高达 2A 的可调充电电流&#xff08;受实际散热和输入功率 限制&#xff09; ■ 支持 12.6V、12.9V、13.05V、13.2V 的充满电压 ■ 高达 28V 的输入耐压保护 ■ 高达 28V 的电池端耐压保护 ■ 宽输入工作电压范围&#xff1a;3.0V~9.5V ■ 峰值效率可达 96…

Linux 文件系列:深入理解文件描述符fd,重定向,自定义shell当中重定向的模拟实现

Linux 文件系列:深入理解文件fd,重定向,自定义shell当中重定向的模拟实现 一.预备知识二.回顾C语言中常见的文件接口跟重定向建立联系1.fopen函数的介绍2.fclose函数的介绍3.代码演示1.以"w"(写)的方式打开2.跟输出重定向的联系3.以 "a"(追加)的方式打开4.…

枚举与尺取法(蓝桥杯 c++ 模板 题目 代码 注解)

目录 组合型枚举&#xff08;排列组合模板&#xff08;&#xff09;&#xff09;: 排列型枚举&#xff08;全排列&#xff09;模板&#xff1a; 题目一&#xff08;公平抽签 排列组合&#xff09;&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff08;座次问题 全排…

Java8的Stream执行机制

Java8的Stream执行机制 Stream的概念解说Stream的概念解说-Stream的含义Stream的概念解说-现实类比Stream的概念解说-Stream中的概念Stream的执行机制Stream的执行机制-最直接的流水线实现方式Stream的执行机制-for循环也能干的事Stream的执行机制-基本类图Stream的执行机制-记…

AI大模型的预训练、迁移和中间件编程

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

jest单元测试

用jest写修改密码的弹出框的单元测试&#xff1a; import { render, fireEvent } from testing-library/react; import ChangePasswordModal from ./ChangePasswordModal;describe(ChangePasswordModal, () > {test(renders password input fields and save button, () >…

经验风险最小化(Empirical Risk Minimization, ERM)

经验风险最小化&#xff08;Empirical Risk Minimization, ERM&#xff09;是机器学习中的一个基本原则&#xff0c;它旨在通过最小化训练数据集上的损失来训练模型。这种方法基于这样一个假设&#xff1a;通过最小化模型在训练集上的误差&#xff08;即经验风险&#xff09;&a…

RS编码的FPGA实现

RS编码&#xff0c;即Reed-solomon codes&#xff0c;是一类纠错能力很强的特殊的非二进制BCH码&#xff08;BCH码是一种有限域中的线性分组码&#xff0c;具有纠正多个随机错误的能力&#xff09;。对于任选正整数S可构造一个相应的码长为nqS-1的 q进制BCH码&#xff0c;而q作…

2024-03-05 linux 分区老显示满,Use 100%,原因是SquashFS 是一种只读文件系统,它在创建时就已经被填满,所有空间都被使用。

一、这两天一直纠结一个问题&#xff0c;无论怎么修改&#xff0c;linux 分区老显示满&#xff0c;Use 100%&#xff0c;全部沾满。如下图的oem分区。 二、导致出现上面的原因是&#xff1a;SquashFS文件系统里的空间利用率总是显示为100%。 三、SDK里面也说明SquashFS文件系统…

$nextTick底层原理(详细) - vue篇

公众号&#xff1a;需要以下pdf&#xff0c;关注下方 2023已经过完了&#xff0c;让我们来把今年的面试题统计号&#xff0c;来备战明年的金三银四&#xff01;所以&#xff0c;不管你是社招还是校招&#xff0c;下面这份前端面试工程师高频面试题&#xff0c;请收好。 前言 n…

【力扣白嫖日记】1045.买下所有产品的客户

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1045.买下所有产品的客户 表&#xff1a;Customer 列名类型customer_idintproduct_keyint 该表可能包含重复…

数据结构 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

运维随录实战(3)

Gitlab架构设计 方案一:SaaS方案 依赖资源: PostgreSQL: 阿里云SAAS服务高可用版2c4g/100GRedis:阿里云SAAS服务高可用版2G代码存储:阿里云NAS盘500GGitLab服务架构: 2*4c8g1*SLB(复用官网SLB)n*GitlabRunner备份方案 PostgreSQL通过阿里云备份功能每天备份一次 代码…

OPC DA协议网关

在工业自动化领域&#xff0c;数据的采集与传输是至关重要的环节。而OPC DA&#xff08;OLE for Process Control Data Access&#xff09;协议作为这一领域内的标准通信协议&#xff0c;为不同设备和软件之间的数据交换提供了统一的接口。今天&#xff0c;我们就来深入了解一下…