拜师教育第一阶段day10_python基础

第十章  文件操作(IO技术)

1.在前面各章节写的程序数据都没有进行实际的存储,因此python 解释器执行完数据就消失了。我们经常需要从外部存储介质(硬盘、光盘、U盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。很多软件系统是将数据存储到数据库中,实际上,数据库的底层操作仍旧为IO流。

2.文件的分类:文本文件(存储普通字符文件,python默认为 unicode 字符集(两个字节表示一个字符,最多可以表示:2**16个)以字符为单位处理)、二进制文件(以字节为单位处理)。注意:word文档不算文本文件(属于二进制文件),里边数据类型是复杂的。

3.常用编码(编码与解码采用的编码形式不同将导致出现乱码):

其中,ASCII码由于最高位用于校验,常用7位字符表示,定义2**7个字符;在此基础上ISO8859-1利用了最高位,增加了128字符的空间,它兼容ASCII码;兼容ISO8859-1基础上收录了汉字,其中汉字占用2个字节,英文占用1个字节;Unicode编码设计成了固定两个字节,但是由于实际上英文字符只占 8位,为统一规定用16位表示,所以会造成空间的浪费,这种编码不兼容任何其他代码;于是为改进Unicode缺点,UTF-8采用变字长编码。unicode中汉字是两个字节,UTF-8 中汉字是 3 个字节。但是互联网中一个网页包含了大量的英文字母,这些英文字母只占用1个字节,整体占用空间,UTF-8仍然优于Unicode。

注意:英文字符在编码发展树上兼容,所以一般乱码(编码解码不一致造成)的都是中文。python处理时用的是Unicode,但实际存储时一般不采用unicode。windows 操作系统默认的编码是 GBK,Linux操作系统默认的编码是 UTF-8。当我们用open()时,调用的是操作系统打开的文件默认编码是 GBK。可以通过encoding='UTF-8'指定文件编码类型。
4.对文件对象(文件也是对象,python对文件进行操作时,要先在程序中创建文件对象,通过IO流指代内存中的实际代码)的操作:

(I)创建文件对象:open(文件名[,打开方式])。如果只是文件名,代表在当前目录下的文件。为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”(r减少转义字符的歧义,直接指明此为文件路径。)。

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

注意:如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。(例如f=open(r'd:\b.jpg','bw')意味着以二进制字节为单位处理文件。)

(II)文本文件的写入:创建open()——写入write()(执行一个对硬盘进行操作的文件处理程序,通过解释器对上述代码解释后,调用操作系统才能对硬盘进行处理。)——关闭close()(必须要有,可通过这个语句关闭解释器打开的相关的资源以及操作系统打开的资源,以免造成资源浪费。)

(III)数据的写入:write(a):把字符串a写入到文件中。
writelines(b):把字符串列表写入文件中,不添加换行符,若要加换行符,自行通过\n处理。

(IV)文件的关闭(当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。)为了确保打开的文件对象正常关闭,一般结合异常机制的 finally或者with 关键字实现无论何种情况都能关闭打开的文件对象。关闭流这里用with上下文管理比较多也比较方便。

(V)文本文件的读取(使用迭代器时,看文档中是否含有换行符,打印输出时应进行相应的改造):

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

readline():读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
readlines():文本文件中,每一行作为一个字符串存入列表中,返回该列表。

注意:通过.strip()命令可以处理掉行首或者行尾的换行;通过enumerate()可以将列表每一个元素和索引关联起来,组成列表内部的元组,并生成列表对象。

(VI)二进制文件的读取:语文本文件的读取类似,不过要增加‘b’模式。(图片拷贝的思想:先读入一个图片文件的原始信息,然后创建新文件再将读到的原始信息写入新文件)

(VII)文件任意位置操作(核心为f.seek()):

seek(offset[,whence]): 把文件指针移动到新的位置,offset 表示相对于whence的多少个字节的偏移量;
——offset:为正往结束方向移动,为负往开始方向移动。
——whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算  2:从文件尾开始计算。
tell() :返回文件指针的当前位置。(一个汉字占3个字符,换行也占一个)
truncate([size]) :不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;如果没有传入 size,则当指针当前位置到文件末尾内容全部删除。

(VIII)对象的序列化与反序列化(导入pickle模块):序列化是指将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件。pickle.load(file) 从file 读取数据,反序列化成对象。

(IX)csv文件的操作:csv逗号分隔符文本格式常用于数据交换、Excel文件和数据库数据的导入和导出。使用之前需要导入import csv ,csv.reader()创建csv对象,它是一个包含所有数据的列表,每一行为一个元素,切记csv不是二进制文件,打开方式中不能增加二进制复合模式‘b’。它是一个包含所有数据的列表,每一行为一个元。csv.writer()创建csv对象,获得csv写入器。b_csv.writerow(headers)写入一行(标题)b_csv.writerows(rows)写入多行(数据)。

(X)os操作:os 模块可以帮助我们直接对操作系统进行操作。使用之前要先导入import os,os.system()可以帮助我们直接调用系统的命令。os.startfile():直接调用可执行文件。(注意:使用rmdir命令时,若目录内有内容,则不能删除。os.makedirs ( "../ 音 乐 / 香 港 / 刘 德 华 " ) 指的是在上一级目录创建多级目录。os.listdir()只返回子目录不返回子目录的子目录。)

os.path 模块:

os.walk(path)递归遍历所有文件和目录:os.walk()方法返回一个 3个元素的元组,(dirpath, dirnames, filenames),dirpath:要列出指定目录的路径dirnames:目录下的所有文件夹,filenames:目录下的所有文件。

5.shutil模块(拷贝、移动、删除和压缩、解压缩):使用前先导入shutil模块,通过shutil.copyfile("1.txt","1_copy.txt")copy源文件到新文件。通过shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm"))(注意:他是将电影音乐文件夹下的内容拷贝到音乐中,且"音乐"文件夹不存在才能用,拷贝时忽略所有的html和htm文件。)

6.zipfile模块(压缩、解压缩):

将指定的多个文件压缩到一个zip文件:

z=zipfile.ZipFile("a.zip","w")
z.write ( " 1.t x t " )
z.write ( " 2.t x t " )
z.close()

将压缩文件解压缩到指定目录下

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

7.递归算法:递归的基本思想就是“自己调用自己”。递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。

8.补(实操作业)(1)通过文件写入方法将['传统节日\n','春节\n','元宵节\n','清明节\n','端午节\n']写入到主目录下的一个文本文档test.txt中,并为每行的字符添加行号,要求行号从1开始,且不改变每行的格式。然后输出源文件名,并重复输出两次第一行的标题。

a=['传统节日\n','春节\n','元宵节\n','清明节\n','端午节\n']
with open(r'../test.txt','w') as f:
        f.writelines(a)
with open(r'../test.txt', 'r') as e:
    list2=[contends.rstrip()+"*****"+str(index+1)+'\n' for index,contends in enumerate(e.readlines())]
    print(e.name)
    for c in range(2):
        e.seek(0,0)
        print(e.readline(),end='')
with open(r'../test1.txt','w') as g:
        g.writelines(list2)

(2)输出指定目录下所有的.py文件的文件名和对应的绝对地址。

import os
import os.path
path=os.getcwd()
filename=os.listdir(path)
abspath=os.path.abspath(path)
for file in filename:
    if file.endswith('.py'):
        print(file,end='\t'*2)
        print(os.path.join(abspath,file))

(3)使用 walk()递归遍历所有文件和目录。

import os
import os.path
all_file=[]
list1=os.walk(os.getcwd())
for dirpath,dirnames,filenames in list1:
    for dir in dirnames:#所有的目录
        all_file.append(os.path.join(dirpath,dir))
    for file in filenames:#所有的文件
        all_file.append(os.path.join(dirpath,file))
for a in all_file:
    print(a)

(4)使用递归算法遍历目录下所有文件(难,重点看)。

import os
allfile = []
def getFiles(path,level):
    childFiles = os.listdir(path)
    for file in childFiles:
        filepath = os.path.join(path, file)
        if os.path.isdir(filepath):
            getFiles(filepath, level + 1)
        allfile.append("\t" * level + filepath)
getFiles(os.getcwd(), 0)
for f in reversed(allfile):
    print(f)

 

 

 

 


 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值