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

文件

输入与输出

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

输出/写文件
输入/读文件
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}")
  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值