Python基础知识-pycharm版-09

文件操作

文本文件和二进制文件

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

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

文件操作的一些模块

名称说明
io 模块文件流的输入和输出操作 input output
os 模块基本操作系统功能,包括文件操作
glob 模块查找符合特定规则的文件路径名
fnmatch 模块使用模式来匹配文件路径名
fileinput 模块处理多个输入文件
filecmp 模块用于文件的比较
cvs 模块用于 csv 文件处理
pickle 和 cPickle用于序列化和反序列化
xml 包用于 XML 数据处理
bz2、gzip、zipfile、zlib、tarfile用于处理压缩和解压缩文件(分别对应不同的算法)

创建对象open()方法

使用格式

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

例如D:\a\b.txt这样的路径,为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”

打开方式描述
r读 read 模式
w写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容;
a追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b二进制 binary 模式(可与其他模式组合使用)
+读、写模式(可与其他模式组合使用)

如果没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。

文本文件写入

基本文件写入操作

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

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象
    例子:
doc_local='D:\learning_folder\interaction.txt'
f=open(doc_local,'a')
message='这只是一个测试'
f.write(message)
f.close()

在这里插入图片描述

常用编码介绍

了解即可,使用时大多用UTF-8
在这里插入图片描述
ASCII 码用 7 位表示,只能表示 128 个字符。
ISO-8859-1 又称 Latin-1,是一个 8 位单字节字符集,它把 ASCII 的最高位也利用起来,并兼容了 ASCII,新增的空间是 128,但它并没有完全用完。
GB2312 全称为信息交换用汉字编码字符集,GB2312 主要收录了 6763 个汉字、682 个符号。GB2312 完全兼容 ISO8859-1。
GBK一共收录了 21003 个汉字。
GB18030收录汉字数超过 70000 余个。
Unicode 编码设计成了固定两个字节,所有的字符都用 16 位(2^16=65536)
表示。
UTF 编码兼容 iso8859-1 编码,同时也可以用来表示所有语言的字符。
不过,UTF 编码是不定长编码,每一个字符的长度从 1-4 个字节不等。
如果写入中文出现乱码
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK。处理方法:右键有file encoding 选择GBK(我的最新版本似乎取消了这个选项,不过下图红色提示有直接选择转码)在这里插入图片描述
或者在代码中直接设置编码格式。
f=open(doc_local,‘a’,encoding=‘utf-8’)

write()/writelines()写入数据

write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符

close()关闭文件流

要及时关闭文件,避免因后续文件出错而导致 前面的写入失败。
当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。
使用同f.write(),close写为f.close()

with()上下文管理器

引用昨天整活的内容:链接
昨天还没学到这就跑去整活了,这里由with()来优化一下代码。
这样就不用自己写close()了。
在这里插入图片描述
with会在执行完内部内容后自动关闭打开的资源,省去了自己调用close(),而且无论执行是否报错,它都会执行清空打开资源这个动作。

文本文件的读取read()

1.read([size]),从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
2.readline(),读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
3.readlines(),文本文件中,每一行作为一个字符串存入列表中,返回该列表。
几种读取的结构:
1.读取前4个字符,文本文件中字母和中文都是以字符为单位

with open(r"bb","r",encoding="utf-8") as f:
	print(f.read(4))

2.读取整个文件内容,文件小的时候,一次性读入比较占用资源。

with open(r"d:\bb.txt","r") as f:
	print(f.read())

3.读取一个文件

with open(r"bb.txt","r") as f:
	while True:
		fragment = f.readline()
		if not fragment:
			break
		else:
			print(fragment,end="")

4.用迭代器读取

with open(r"d:\bb.txt","r") as f:
	for a in f:
		print(a,end="")

enumerate()函数和推导式生成列表

enumerate()函数作用如下,相当于给列表a中的元素添加了索引并转化为元组。
在这里插入图片描述
推导式生成列表,for num,a1 in enumerate(a)中num与a1是两个参数,因为b(enumerate(a))中每一个有两个元素,这样来一一对应。

c=[a1+'#'+str(num) for num,a1 in enumerate(a)]
print(c)

另外,对于读入的每一行,尾部会有\n,如果想去掉可以写a1.rstrip()

二进制文件的读写

读写方式同上面的文件操作,区别在于后面的读写方式需要加一个字母b来表示是二进制文件。
例如
open(‘D:\aa.jpg’,‘wb’)

文件对象常用属性和方法

文件对象的属性

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

文件对象的打开模式

模式说明
r读模式
w写模式
a追加模式
b二进制模式(可与其他模式组合)
+读写模式(可以其他模式组合)

文件对象的常用方法

方法名说明
read([size])从文件中读取 size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline()从文本文件中读取一行内容
readlines()把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str)将字符串 str 内容写入文件
writelines(s)将字符串列表 s 写入文件文件,不添加换行符
seek(offset[,whence])把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算
tell()返回文件指针的当前位置
truncate([size])不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;如果没有传入 size,则当指针当前位置到文件末尾内容全部删除
flush()把缓冲区的内容写入文件,但不关闭文件
close()把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源

使用pickle序列化

使用标准模块中的pickle模块
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
注意,这两个不是一个对象,可以看下面输出的地址。
在这里插入图片描述

CSV文件的操作

csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。
文件内容格式如下:
在这里插入图片描述

csv.reader对象和csv文件读取

csv中的内容
在这里插入图片描述

import csv
with open("D:\learning_folder\Temmie.csv",'r') as a:
    a_csv = csv.reader(a) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
    for row in a_csv: #循环打印各行内容
        print(row)

在这里插入图片描述
写入的话:

import csv
with open("D:\learning_folder\Temmie.csv",'w') as a:
    a_csv = csv.writer(a) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
    a_csv.writerow(['1','2','3'])

在这里插入图片描述

如果是writerows则支持写入多行列表([[],[]]类似于这样的)

os与os.path模块

os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
这里只是简单的了解一下,不详细讲解。

os 模块-调用操作系统命令

os.system 可以帮助我们直接调用系统的命令
os.system 调用 windows 系统的记事本程序

import os
os.system("notepad.exe")

os.system 调用 windows 系统中 ping 命令

import os
os.system("ping www.baidu.com")

出现乱码?
在这里插入图片描述
解决办法在设置里设置一下file codeing-global encoding改成GBK即可在这里插入图片描述
好使了
在这里插入图片描述

os.startfile:直接调用可执行文件

记得找exe的路径

import os
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")

os 模块-文件和目录操作

方法名描述
remove(path)删除指定的文件
rename(src,dest)重命名文件或目录
stat(path)返回文件的所有属性
listdir(path)返回 path 目录下的文件和目录列表

os 模块下关于目录操作的相关方法

方法名方法
mkdir(path)创建目录
makedirs(path1/path2/path3/…)创建多级目录
rmdir(path)删除目录
removedirs(path1/path2…)删除多级目录
getcwd()返回当前工作目录:current work dir
chdir(path)把 path 设为当前工作目录
walk()遍历目录树
sep当前操作系统所使用的路径分隔符

os.path 模块

os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作

方法描述
isabs(path)判断 path 是否绝对路径
isdir(path)判断 path 是否为目录
isfile(path)判断 path 是否为文件
exists(path)判断指定路径的文件是否存在
getsize(filename)返回文件的大小
abspath(path)返回绝对路径
dirname§返回目录的路径
getatime(filename)返回文件的最后访问时间
getmtime(filename)返回文件的最后修改时间
walk(top,func,arg)递归方式遍历目录
join(path,*paths)连接多个 path
split(path)对路径进行分割,以列表形式返回
splitext(path)从路径中分割文件的扩展名

walk()递归遍历所有文件和目录

返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件

shutil 模块(拷贝和压缩)

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

import shutil
shutil.copyfile('a.txt','a_copy.txt')#拷贝文件
shutil.copytree('pic','picc')#拷贝文件夹
shutil.copytree('pic','picc',ignore=shutil.ignore_patterns('*.txt'))#拷贝文件夹,但不拷贝txt文件。

压缩

shutil.make_archive('压缩完所在位置及名字','压缩格式','压缩的内容')

递归

递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
例子见前面求阶乘的例子 递归函数
递归结构包括两个部分:1.定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。2.递归体。解答:什么时候需要调用自身方法。
简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值