微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

8.文件操作及模块包

文件操作及模块包

1.文本文件和二进制文件

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

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

2.创建文件对象 open()

open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件文件名可以录入全路径,比如:D:\a\b.txt。

为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:

f = open(r"d:\b.txt",“w”)

打开方式有如下几种:

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

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

3.文本文件的写入

3.1基本的文件写入操作

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

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象

我们首先创建一个小程序,体验一下文本文件的写入操作。
【操作】文本写入操作简单测试

f = open(r"a.txt","a")
s = "itbaizhan\nsxt\n"
f.write(s)
f.close()

3.2常用编码介绍

在这里插入图片描述

3.3.中文乱码问题

windows 操作系统认的编码是 GBK,Linux 操作系统认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件认的编码是 GBK。

3.4 write()/writelines()写入数据

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

f = open(r"d:\bb.txt","w",encoding="utf-8")
s = ["高淇\n","高老三\n","高老四\n"]
f.writelines(s)
f.close()

3.5close()关闭文件

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。

为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。
【操作】结合异常机制 finally 确保关闭文件对象

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

3.6with 语句(上下文管理器)

with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
【操作】使用 with 管理文件写入操作

s = ["高淇\n","高老三\n","高老五\n"]
with open(r"d:\bb.txt","w") as f:
	f.writelines(s)

4.文本文件的读取

文件的读取一般使用如下三个方法

  1. read([size])
    文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件
    读取到文件末尾,会返回空字符串。

  2. readline()
    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。

  3. readlines()
    文本文件中,每一行作为一个字符串存入列表中,返回该列表
    【操作】 读取一个文件前 4 个字符

with open(r"bb","r",encoding="utf-8") as f:
print(f.read(4))
#按行读取一个文件
with open(r'a.txt','r',encoding='utf-8') as f:
    for a in f:
        print(a,end='')
        
with open(r'a.txt','r',encoding='utf-8') as f:
    line=f.readlines()
    lines=[ line.rstrip()+' #'+str(index+1)+'\n' for index,line in enumerate(line)]   #推导式生成列表

with open(r'a.txt','w',encoding='utf-8') as f:
    f.writelines(lines)
    
为文本文件每一行的末尾增加行号
执行程序后文件内容:
我 love u! #1
尚学堂 #2
百战程序员 #3

5.二进制文件的读取和写入

二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:

f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象
创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作。
【操作】 读取图片文件,实现文件的拷贝

with open('a.gif','rb') as f:
    with open('aa.gif','wb') as w:
        for line in f.readlines():
            w.write(line)
print('图片拷贝完成')

6.文件对象的常用属性方法

文件对象的属性

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.文件任意位置操作

【示例】seek()移动文件指针示例

with open('a.txt','r',encoding='utf-8') as f:
    print('文件名是{0}'.format(f.name))
    print(f.tell())
    print('读取的内容{0}'.format(f.readline()))
    print(f.tell())
    f.seek(0,0)
    print('读取的内容{0}'.format(str(f.readline()))

8.使用 pickle 序列化

Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。

序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
【操作】将对象序列化到文件

import pickle
a1='高启'
a2=234
a3=[10,20,30,40]
with open('a.txt','wb')as f:
    pickle.dump(a1,f)
    pickle.dump(a2,f)
    pickle.dump(a3,f)
with open('a.txt','rb')as f:
    b1=pickle.load(f)
    b2=pickle.load(f)
    b3=pickle.load(f)
    print(b1);print(b2);print(b3)

    print(id(a1))
    print(id(b1))
    
高启
234
[10, 20, 30, 40]
1668140626256
1668143155312

9.CSV 文件的操作

csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件数据库数据的导入和导出。与 Excel 文件不同,CSV 文件中:

值没有类型,所有值都是字符串

不能指定字体颜色等样式

不能指定单元格的宽高,不能合并单元格

没有多个工作表

不能嵌入图像图表

Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。
我们在 excel 中建立一个简单的表格,另存为"csv(逗号分隔)",我们打开查看这个 csv 文件内容
姓名,年龄,工作,薪水
高淇,18,程序员,50000
高老三,19,测试工程师,20000
高老五,20,人工智能开发,50000

9.1csv.reader 对象和 csv 文件读取

【操作】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)
       

9.2csv.writer 对象和 csv 文件写入

【操作】csv.writer 对象写一个 csv 文件

import csv

headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1001","高淇",18,"西三旗 1 号院","50000"),("1002","高八",19,"西三旗 1 号院","30000")]

with open(r"d:\b.csv","w") as b:
	b_csv = csv.writer(b) #创建 csv 对象
	b_csv.writerow(headers) #写入一行(标题
	b_csv.writerows(rows) #写入多行(数据)

10.os 和 os.path 模块

os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。

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

  • os.system 可以帮助我们直接调用系统的命令
import os
# os.system('notepad.exe')
# os.system('regedit')

#直接调用可执行的文件
os.startfile(r'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\微信')

10.2os 模块-文件和目录操作

可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。

在这里插入图片描述

在这里插入图片描述

【示例】os 模块:创建、删除目录、获取文件信息等

import os
#测试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("my02.py"))
##############关于工作目录的操作###############
#print(os.getcwd())
#os.chdir("d:") #改变当前的工作目录为:d:盘根目录
# os.mkdir("书籍")

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

#os.makedirs("电影/港台/周星驰")
#os.removedirs("电影/港台/周星驰") #只能删除空目录

#os.makedirs("../音乐/香港/刘德华") #../指的是上一级目录
#os.rename("电影","movie")
dirs = os.listdir("movie")
print(dirs)

10.3os.path 模块

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

【示例】列出指定目录下所有的.py 文件,并输出文件

#列出指定目录下所有的.py 文件,并输出文件
import os
import os.path

path=os.getcwd()

file_list=os.listdir(path)  #列出列表 子目录
for filename in file_list:
    if filename.endswith('py'):
        print(filename)
print('--------')
file_list2=[filename for filename in os.listdir(path) if filename.endswith('py')]
for f in file_list2:
    print(f,end='\t')

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

os.walk()方法

返回一个 3 个元素的元组,(dirpath, dirnames, filenames), dirpath:要列出指定目录的路径
dirnames:目录下的所有文件
filenames:目录下的所有文件
【示例】使用 walk()递归遍历所有文件和目录

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(os.path.join(dirpath,dir))
    for file in filenames:
        all_files.append(os.path.join(dirpath,file))

#打印所有子目录和文件
for file in all_files:
    print(file)

11.shutil 模块(拷贝和压缩)

shutil 模块是 python 标准库中提供的,主要用来做文件文件夹的拷贝、移动、删除等;还可以做
文件文件夹的压缩、解压缩操作。
os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操
作,这些 os 模块都没有提供。
【示例】实现文件的拷贝

import shutil
# shutil.copyfile('a.txt','aa.txt')
shutil.copytree('movie/a.txt','电影')  #电影文件不存在时才能拷贝

【示例】实现将文件夹所有内容压缩(使用 shutil 模块)

import shutil
import zipfile
#将"电影/学习"文件夹下所有内容压缩到"音乐 2"文件夹下生成 movie.zip
#shutil.make_archive("音乐 2/movie","zip","电影/学习")

#压缩:将指定的多个文件压缩到一个 zip 文件
z1=zipfile.ZipFile('a.zip','w')
z1.write('a.txt')
z1.write('aa.txt')
z1.close()

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

12.递归算法

递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。

递归结构包括两个部分:

定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。

递归体。解答:什么时候需要调用自身方法
【示例 3-22】使用递归求 n!

def factorial(n):
    if n==1:
        return n
    else:return n*factorial(n-1)

print(factorial(5))

递归的缺陷

简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。

【示例】使用递归算法遍历目录下所有文件

import os
allfiles=[]
def getALLFiles(path,level):
    childFilesa=os.listdir(path)
    for file in childFilesa:
        filepath=os.path.join(path,file)
        if os.path.isdir(filepath):
            getALLFiles(filepath,level+1)
        allfiles.append('\t'*level+filepath)

getALLFiles('python',0)
for f in reversed(allfiles):
    print(f)

原文地址:https://www.jb51.cc/wenti/3280366.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐