小言_互联网的博客

Python基础知识-pycharm版-09

462人阅读  评论(0)

文件操作

文本文件和二进制文件

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

  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.递归体。解答:什么时候需要调用自身方法。
简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。


转载:https://blog.csdn.net/Temmie1024/article/details/115973014
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场