韩顺平 | 零基础快速学Python(16) 文件处理

news2024/12/25 8:52:46

文件

输入与输出

输入:数据从数据源(文件)到程序(内存);
输出:数据从程序(内存)到数据源(文件)。

输出/写文件
输入/读文件
py程序(加载到内存)
文件(存放于磁盘)

I/O类型

Python用于处理各种I/O类型(Input/Output 类型),主要的I/O类型分别为:文件I/O,二进制I/O,对应处理的文件对象类别:文件文本、二进制文件
文件文本:通常是记事本可以直接打开的 .py .txt;
二进制文件:图片、音频、视频等。
不同类型文件需要用对应方式打开。

文件编码

文件编码/字符编码:规定了如何将内容翻译成二进制,以及如何将二进制翻译成可识别的内容。
常见编码:UTF-8(使用最多)、GBK、BIG5、GB2312、ANSI国标码(根据系统,中文简体对应GBK)
查看编码函数:hex(ord("字符")) 16进制转为10进制
编码转换工具

常见的文件操作

open(file, mode='r', encoding=None)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建文件

创建文件,以mode=“w”-写入形式打开文件,如果文件不存在,系统会自动创建。encoding不能少,因为和参数位置不对应,无法按参数位置传递。

f1 = open("d://a/hi.txt:", "w", encoding="utf-8)" #前提是目录存在
print(f"文件创建成功类型是:{type(f1)}") #<class '_io.TextIOWrapper'>

读文件

读取文件:mode=“r”-读取(默认)

 f = open("d://a/hi.txt:", "r", encoding="utf-8)
 
 # 读取方式1:read()
 content = f.read() # 一次返回整个文件的内容
 #content = f.read(6) #读取6个字符
 print(content)

# 读取方式2:readline() 字符串末尾保留换行符\n
while True:
	line_content = f.readline # 循环读取整个文件 一行行读
	if line_content == "": #读取完毕
		break
	print(line_content, end="") #print不输出换行 

# 读取方式3:readlines() 列表形式读取文件中所有行
lines = f.readlines()
for line in lines:
	print(line, end="")
print(lines) #["line1\n", "line2\n"...]

# 读取方式4:直接遍历打开文件获取的文件对象
for line in f:
	print(line, end="")

# 关闭文件,释放文件占用的系统资源
f.close() 

写文件

创建文件,以mode=“w”-写入形式打开文件,如果文件不存在,系统会自动创建;如果文件已存在,会先截断打开的文件,也就是清空文件内容(!!!)
· mode=“a”:追加写入

f1 = open("d://a/hi.txt:", "w", encoding="utf-8)" #前提是目录存在
i = 1
while i <= 10:
	f.write(f"hello, world!\n"))
	i += 1
f.close()

删除文件

import os
if os.path.exists("d://a/abc.txt") #判断指定路径文件是否存在
	os.remove("d://a/abc.txt") #如果存在,删除文件
else:
	print("不存在")

对目录的操作

import os

if os.path.isdir("d://aaa") #判断目录是否存在
	print("已存在")
else:
	os.mkdir("d://aaa") # 创建单级目录

if os.path.isdir("d://bbb//ccc")
	print("已存在")
else:
	os.makedirs("d://bbb//ccc") #递归创建多级目录

if os.path.isdir("d://aaa") 
	os.rmdir("d://aaa") # 删除单级目录
else:
	print("不存在")
	
if os.path.isdir("d://bbb//ccc")
	os.removedirs("d://bbb//ccc") #删除多级目录
else:
	print("不存在")

获取文件的相关信息

import os
import time
#time.ctime() # 将返回的时间戳转为字符串格式
f_stat = os.stat("d:/python/hello.py") # 获取文件或文件描述符的状态,返回一个stst_result对象
print(f"文件大小->{time.ctime(f_stat.st_atime)} \n"
	  f"最近访问时间->{time.ctime(f_stat.st_atime)} \n"
	  f"最近修改时间->{time.ctime(f_stat.st_mtime)} \n"
	  f"文件创建时间->{time.ctime(f_stat.st_ctime)} \n")

f.flush():刷新流的写入缓冲区到文件。
调用f.write()内容先积攒到缓存区,刷新后才真正写入文件,避免频繁操作硬盘,导致低效率
f.close:刷新并关闭流。
with open() as f:在处理文件对象时,子句体结束后,文件会自动关闭

with open("d://a//hello.txt", "r", encoding="UTF-8") as f:
	lines = f.readlines()
	for line in lines:
		print(line, end="")
print("\n文件是否关闭->", f.closed) #true

关于目录分隔符号:为兼容,推荐/
windows:/ //
linux/unix: /

应用实例

拷贝文件

使用原生方法 read() write()读取
1 打开源文件,读取文件的数据
2 打开目标文件,把读取的文件数据写入
3 注意:若二进制文件需以二进制方式打开

f_src_path = "C:/srcpath/pig.jpg"
f_dst_path = "d:/dstpath/pig.jpg"

# 方式1
f_src = open(f_src_path, "rb") #r读取 b二进制文件 编码默认和系统保持一致
data = f_src.read()
f_dst = open(f_src_path, "wb")
f_dst.write(data)
f_src.close()
f_dst.close()

#方式2 with子句方式完成文件拷贝 读一行写一行(文件大,减轻内存压力)
with open (f_src_path, "rb") as f_src:
	with open (f_dst_path, "wb") as f_dst:
		for data in f_src:
			f_dst.write(data)

遍历目录

判断是目录还是文件
1 获取文件夹(目录)所有内容(元素),所有文件和目录
2 判断是目录还是文件
3 化繁为简:先考虑单级目录,再考虑多级目录
3.1 如果是目录,输出信息再递归处理
3.2 如果是文件,输出对应信息即可

import os
dir_path = "d:/a"

# 判断单级目录
content_list = os.listdir(dir_path) #列表形式返回目录内所有内容
print("content_list:", content_list)
for ele in content_list:
	child_ele = dir_path + "/" + ele
	if os.path.isdir(child_ele):
		print(f"目录:{child_ele}")
	else:
		print(f"文件:{child_ele}")

# 递归遍历多级目录
def print_dir_all_content(dir_path):
	content_list = os.listdir(dir_path) 
	for ele in content_list:
		child_ele = dir_path + "/" + ele
		if os.path.isdir(child_ele):
			print(f"目录:{child_ele}")
			print_dir_all_content(chile_ele) #递归操作
		else:
			print(f"文件:{child_ele}")

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

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

相关文章

SpringBoot源码解析-01

SpringBoot3详细版 一&#xff1a;SpringBoot引入&#xff1a; 1.1.什么是Springboot&#xff1a; SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编…

洛谷 P9532 [YsOI2023] 前缀和

题目背景 Ysuperman 模板测试的试机题。 小心立秋&#xff0c;小心秋丽。 题目描述 立秋有一个长度为 n 的数组 a&#xff0c;所有数字都是正整数&#xff0c;并且除了其中第一个数字以外其它数字都等于前面所有数字的和。 例如&#xff0c;数组 [1,1,2,4,8,16] 就有可能是…

如何入行产品经理?

转产品经理第一点要先学基础理论知识&#xff0c;学了理论再去实践&#xff0c;转行&#xff0c;跳槽&#xff01; 学理论比较好的就是去报NPDP的系统班&#xff0c;考后也会有面试指导课&#xff0c;跟职场晋升课程&#xff0c;对小白来说非常合适了~&#xff08;可以去哔站找…

【程序分享】AACSD 程序: 用于晶体结构和缺陷的原子分析平台

分享一个 AACSD 程序: 用于晶体结构和缺陷的原子分析平台。 感谢论文的原作者&#xff01; 主要内容 “我们开发了一个名为 AACSD&#xff08;晶体结构和缺陷原子分析器&#xff09;的高效命令行程序&#xff0c;用于对各种原子模拟代码生成的原子配置进行后期分析。该程序不…

利用栈删除数组中重复元素

先将数据排序&#xff08;降序或升序&#xff09; 建立一个“栈”&#xff0c;三种情况&#xff1a; 1.栈为空&#xff1a;压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素&#xff1a;压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素&#xff1a;删除将压入元素…

循环双链表的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一个裂缝都是为透出光而努力&#…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

mysql dump导出导入数据

前言 mysqldump是MySQL数据库中一个非常有用的命令行工具&#xff0c;用于备份和还原数据库。它可以将整个数据库或者特定的表导出为一个SQL文件&#xff0c;以便在需要时进行恢复或迁移。 使用mysqldump可以执行以下操作&#xff1a; 备份数据库&#xff1a;可以使用mysqld…

【Linux 驱动基础】设备树中断

# 前置知识 interrupts 文档 Specifying interrupt information for devices 1) Interrupt client nodes -------------------------Nodes that describe devices which generate interrupts must contain an "interrupts" property, an "interrupts-extende…

【数据库】表的增删改(CUD)

目录 一、insert 插入 1.单行插入&#xff1a; 2.多行插入&#xff1a; (1) insert into 插入&#xff1a; (2) replace into 替换插入&#xff1a; (3) 图片插入 &#xff1a; 二、update 修改 三、delete 删除 一、insert 插入 语法&#xff1a; INSERT INTO table_name…

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

go语言并发实战——日志收集系统(一) 项目前言

-goroutine- 简介 go并发编程的练手项目 项目背景 一般来说业务系统都有自己的日志,当系统出现问题时,我们一般需要通过日志信息来定位与解决问题&#xff0c;当系统机器较少时我们可以登录服务器来查看,但是当系统机器较多时,我们通过服务器来查看日志的成本就会变得很大,…

leetcode刷题日记之全排列

题目描述 题目解释 这个题类似于之前做的某一道题&#xff0c;其实算法还是要追踪到树的深度遍历&#xff0c;相当于便利叶子节点的路径记录。不过递归的过程就相当于件数根据树进行遍历了。 代码如下 class Solution:def permute(self, nums: List[int]) -> List[List[i…

电动汽车原理视频笔记

看到了一个讲的不错的系列视频 新能源维修猿老罗的个人空间-新能源维修猿老罗个人主页-哔哩哔哩视频 道路千万条&#xff0c;安全第一条&#xff01;新能源维修高压安全知识以及维修工具介绍_哔哩哔哩_bilibili 那么简单&#xff01;电动汽车高压配电和控制_哔哩哔哩_bilibili…

EasyRecovery数据恢复软件2024百度云网盘下载链接

EasyRecovery数据恢复软件是一款功能强大的数据恢复工具&#xff0c;它能够帮助用户从各种存储设备中恢复丢失或误删除的文件数据。无论是由于意外删除、格式化、病毒攻击还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的解决方案。 该软件支持多种存储介质…

创维:在博鳌论坛 叩响世界之门

出走半生&#xff0c;归来仍是少年。 2024年4月8日&#xff0c;一个离开海南近半个世纪的“少年”回到琼海博鳌&#xff0c;“下一站&#xff0c;1000亿&#xff01;”&#xff0c;他的承诺掷地有声。“1000亿”&#xff0c;意指创维集团在2025年前冲击千亿营收&#xff0c;这…

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 访问实例变量和方法继承接口 访问实例变量和方法 通过已创建的对象来访问成员变量和成员方法&#xff0c;如下所示&#xff1a; /* 实例化对象 */ Object referenceVariable new Constructor(); /* 访问类中的变量 */ refer…

【视频异常检测】Learning Multimodal Violence Detection under Weak Supervision 论文阅读

Not only Look, but also Listen: Learning Multimodal Violence Detection under Weak Supervision 论文阅读 Abstract1 Introduction2 Related Work3 XD-Violence Dataset3.1 Selecting Violence Categories3.2 Collection and AnnotationVideo annotation.3.3 Dataset Stati…

如何下载Plugin Registration Tool

今天给大家演示一下如何使用Power Platform CLI来下载Plugin Registration Tool. 前提条件 本地需要安装.net 1. 下载并安装Power Platform CLI 可以在VS Code的Terminal中使用powershell或者直接在cmd中运行下面的命令&#xff1a; dotnet tool install --global Microsof…