2021-02-05Python文件(IO)

这篇博客详细介绍了Python中的文件操作,包括文本文件和二进制文件的读写,编码处理,以及标准库中的pickle模块用于序列化和反序列化对象。还涉及os和os.path模块,用于操作系统交互,如文件和目录的操作,以及文件路径的处理。此外,还讨论了shutil模块的文件和目录拷贝、移动和删除功能。最后,讲解了CSV文件的读写以及文件对象的方法和属性。
摘要由CSDN通过智能技术生成

Python文件

文件分类

按文件中数据组织形式,分为文本文件和二进制文件两大类:

  1. 文本文件
    文本文件存储的是普通“字符”文本,python 默认为unicode 字符集两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开
    但是,像word 软件编辑的文档不是文本文件
  2. 二进制文件
    二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码
    常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等

常用编码介绍

在这里插入图片描述
Python程序运行时默认Unicode
windows 操作系统默认的编码是GBK,Linux 操作系统默认的编码是UTF-8
open()时,调用的是操作系统打开的文件,默认的编码是系统编码
f = open(r"b.txt",“w”,encoding=“utf-8”)

Python标准库中的文件操作相关模块

在这里插入图片描述

使用pickle序列化

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方;反序列化是指相反的过程,将读取到的“串行化数据”转化成对象

  • pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
  • pickle.load(file) 从file 读取数据,反序列化成对象

os和os.path模块

对操作系统进行操作,直接调用操作系统的文件、命令,直接操作文件、目录等

os.system调用系统命令
>>>import os
>>> os.startfile(r"C:\Program Files\XMind\XMind.exe")
os模块文件和目录操作**

文件操作:
在这里插入图片描述
目录操作:
在这里插入图片描述

# coding=utf-8
# 测试os 模块中,关于文件和目录的操作
import os

# 获取文件和文件夹相关的信息
print(os.name)  # windows->nt linux 和unix->posix
print(os.sep)  # windows->\ linux 和unix->/
print(repr(os.linesep))  # windows->\r\n linux-->\n\
print(os.stat("test.py"))  # 获取文件信息

# 关于工作目录的操作
print(os.getcwd())
os.chdir("d:")  # 改变当前的工作目录为:d:盘根目录
os.mkdir("subfield")

# 创建目录、创建多级目录、删除
os.mkdir("subfield")
os.rmdir("subfield") #相对路径都是相对于当前的工作目录

os.makedirs("subfield/subsubfield")
os.removedirs("subfield/subsubfield") #只能删除空目录
os.makedirs("../subfield/subsubfield") #../指的是上一级目录
os.rename("subfield","subfolder")
dirs = os.listdir("subfolder")
print(dirs)
walk() 递归遍历所有文件和目录
#coding=utf-8
# dirpath:要列出指定目录的路径
# dirnames:目录下的所有文件夹
# filenames:目录下的所有文件
import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
	for dir in dirnames:
		# all_files.append(dir)
		all_files.append(os.path.join(dirpath,dir))
	for name in filenames:
		# all_files.append(name)
		all_files.append(os.path.join(dirpath,name))
#打印子目录和子文件
for file in all_files:
	print(file)
os.path模块

在这里插入图片描述

#测试os.path 常用方法
import os
import os.path
#################获得目录、文件基本信息######################
print(os.path.isabs("d:/a.txt")) #是否绝对路径
print(os.path.isdir("d:/a.txt")) #是否目录
print(os.path.isfile("d:/a.txt")) #是否文件
print(os.path.exists("a.txt")) #文件是否存在
print(os.path.getsize("a.txt")) #文件大小
print(os.path.abspath("a.txt")) #输出绝对路径
print(os.path.dirname("d:/a.txt")) #输出所在目录

########获得创建时间、访问时间、最后修改时间##########
print(os.path.getctime("a.txt")) #返回创建时间
print(os.path.getatime("a.txt")) #返回最后访问时间
print(os.path.getmtime("a.txt")) #返回最后修改时间

################对路径进行分割、连接操作####################
path = os.path.abspath("a.txt") #返回绝对路径
print(os.path.split(path)) #返回元组:目录、文件
('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os', 'a.txt')
print(os.path.splitext(path)) #返回元组:路径、扩展名
('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os\\a','.txt')
print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc
#coding=utf-8
#列出指定目录下所有的.py 文件,并输出文件名
import os
import os.path
path = os.getcwd()
file_list = os.listdir(path) #列出子目录和子文件
for filename in file_list:
	pos = filename.rfind(".")
	if filename[pos+1:]=="py":
		print(filename,end="\t")
		
print("##################")
file_list2 = [filename for filename in os.listdir(path) if filename.endswith(".py") ]
for filename in file_list2:
	print(filename,end="\t")

shutil 模块

shutil 模块是python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作

import shutil
import zipfile

shutil.copyfile("1.txt","1_copy.txt")  #copy 文件内容

shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm"))  #将文件夹“电影/学习”下面的内容拷贝到文件夹“音乐”下;拷贝时忽略所有的html 和htm 文件;音乐文件夹需要不存在!!!

z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close()  # 压缩:将指定的多个文件压缩到一个zip 文件
shutil.make_archive("音乐2/movie","zip","电影/学习") # 将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成movie.zip

z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") #设置解压的地址
z2.close()  # 解压缩

文本文件

文本文件写入

文本文件的写入一般就是三个步骤:

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象
    write(a):把字符串a 写入到文件中
    writelines(b):把字符串列表写入文件中,不添加换行符
open()

open(文件名[,打开方式])

模式描述
rread
wwrite;如果文件不存在,则创建;如果文件存在,则重写内容
aappend;如果文件不存在,则创建;如果文件存在,则在文件末尾追加内容
bbinary;如果没有指定b,则默认文本文件,处理的基本单元是字符;如果设置b,则创建二进制文件对象,处理的基本单元是字节
+读、写模式
close()

由于文件底层是由操作系统控制,所以打开的文件对象必须显式调用close()方法关闭文件对象
当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象
为了确保打开的文件对象正常关闭,一般结合异常机制的finally 或者with 关键字实现无论何种情况都能关闭打开的文件对象。
在这里插入图片描述

# finally
try:
	f = open(r"my01.txt","a")
	str = "test"
	f.write(str)
except BaseException as e:
	print(e)
finally:
	f.close

# with
with open(r"d:\bb.txt","w") as f:
	f.writelines("test")

文本文件读取

  1. read([size]):从文件中读取size 个字符,并作为结果返回;如果没有size 参数,则读取整个文件;读取到文件末尾,会返回空字符串
  2. readline():读取一行内容作为结果返回,读取到文件末尾,会返回空字符串
  3. readlines():文本文件中,每一行作为一个字符串存入列表中返回该列表
# 迭代器读取
with open(r"d:\bb.txt","r") as f:
	for a in f:
		print(a,end="") # 结尾不打印换行符
enumerate()

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
with open("e.txt","r",encoding="utf-8") as f:
	lines = f.readlines()
	lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)] #推导式生成列表
with open("e.txt","w",encoding="utf-8") as f:
	f.writelines(lines)

二进制文件

指定二进制模式
f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象

CSV文件

csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出
所有值都是字符串,不能定义复杂样式和信息
csv.reader 用于从csv 文件读取数据

import csv
with open(r"d:\a.csv") as a:
	a_csv = csv.reader(a) #创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
	headers = next(a_csv) #获得列表对象,包含标题行的信息
	print(headers)
	for row in a_csv: #循环打印各行内容
		print(row)

csv.writer 对象写一个csv 文件

import csv
headers = ["工号","姓名","年龄"]
rows = [("1001","Jason",18),("1002","Anna",19)] # 也可以使用列表
with open(r"d:\b.csv","w") as b:
	b_csv = csv.writer(b) #创建csv 对象
	b_csv.writerow(headers) #写入一行(标题)
	b_csv.writerows(rows) #写入多行(数据)

文件对象常用方法和属性

常用属性:

属性说明
name返回文件的名字
mode返回文件的打开模式
closed若文件被关闭则返回True

常用方法:

方法名说明
read([size])从文件中读取size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline()从文本文件中读取一行内容
readlines()把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str)将字符串str 内容写入文件
writelines(s)将字符串列表s 写入文件文件,不添加换行符
seek(offset把文件指针移动到新的位置,offset 表示相对于whence 的多少个
[,whence])字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算
tell()返回文件指针的当前位置
truncate([size])不论指针在什么位置,只留下指针前size 个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除
flush()把缓冲区的内容写入文件,但不关闭文件
close()把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值