Python基础知识第十天

文件操作(IO技术):
文本文件:是用来存储字符的文件(记事本),就是文本文件,默认使用unicode字符集(两个字节表示一个字符)
二进制文件:把数据内容用“字节”进行储存,无法用记事本打开,必须用专用软件解码,常见有MP4文件、MP3文件、JPG文件、doc文档等

创建文件对象open():
open()函数用于创建文件对象,语法为:

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

如果只是文件名,代表在当前目录下的文件,文件名可以录入全路径,比如: D:\a\b.txt,为了减少“\”的输入,可以使用原始字符串:r"d:\b.txt",示例如下:

f = open(r"d:\b.txt", "a")

a为模式,有多种:

r: 读模式
w: 写模式,如果文件不存在则创建;如果文件存在,则重写内容
a: 追加模式,如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b: 二进制模式(可与其他模式组合使用),如果没有表明使用该模式,文件默认为文本文件
+: 读、写模式(可与其他模式组合使用)

文本文件的写入:
操作:1、创建文件对象 2、写入数据 3、关闭文件对象

#示例
f = open(文件名)
f.write('写入的内容')
f.close()

Python程序执行时默认使用unicode编码程序,Windows操作系统默认是GBK,所以Python写入的文件在存储时会转为GBK格式,打开也需要GBK格式,否则会乱码
可以在Python写入文件时规定编码:

f = open(文件名,encoding = '编码')

write()和writelines()写入数据:
write() 是把字符串写入文件中
writelines() 是把字符串写入文件中,不添加换行符,需手动添加
close()关闭文件流:

try:
	f = open(...)
	f.write(...)
except BaseException as e:
	print(e)
finally:
	f.close()

with语句(上下文管理):
with会自动管理资源,执行完语句后会自动关闭资源

with open(...) as f:
	f.writelines(...)

文本文件的读取:
1、read([size]): 从文件中读取size个字符,如果没有size参数1,默认读取整个文件
2、readline(): 读取一行作为返回结果,读取到文件末尾,会返回空字符串
3、readlines() 文本文件中每一行作为一个字符串存入列表,返回该列表

enumerate()函数,将对象和索引关联:

with open(r'e.txt', 'r', encoding= 'GBK') as f:
    a = f.readlines()
    b = [temp.rstrip() + ' #' + str(index) + '\n' for index, temp in enumerate(a)]
with open(r'e.txt', 'w', encoding='GBK') as f:
    f.writelines(b)

二进制文件读写:
和文本文件一致,唯一需要注意模式加"b"

open('文件名', 'rb'/'wb'/'ab')

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

使用pickle序列化:
序列化指将程序中的对象,储存到硬盘或者通过网络传到其他地方
反序列化指将储存在硬盘中的数据转化成程序中的对象

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

#将对象序列化到文件中
import pickle
with open('文件名', 'wb') as f:
	a1 = 'Y'
	a2 = 234
	a3 = [3, 45, 1]

	pickle.dump(a1, f)
	pickle.dump(a2, f)
	pickle.dump(a3, f) 

#反序列化成对象
import pickle
with open('文件名', 'rb') as f:
	a1 = pickle.load(f)
	a2 = pickle.load(f)
	a3 = pickle.load(f)
	print(a1)
	print(a2)
	print(a3)

CSV文件操作:

#读取
import csv
with open('文件名.csv', 'r') as f:
	a = csv.reader(f)

#写入
import csv
with open('e.csv', 'w', encoding='GBK') as f:
    a = csv.writer(f)
    a.writerow(['名字', '年龄', '成绩'])
    a.writerow(['987', '3', 'Y'])
    b = [['名字', '年龄', '成绩'], ['Y', '27', '100'], ['S', '24', '100']]
    a.writerows(b)

os和os.path模块:
该模块能帮助我们直接对操作系统进行操作,我们可以直接调用操作系统的可执行文件、命令、直接操作文件、目录等

os调用操作系统文件和命令:

import os
os.system('notepad.exe') #调用记事本

#直接调用文件
import os
os.startfile(r'目标文件路径')

os模块,文件和目录操作:

os.remove(path) #删除指定文件
os.rename() #重命名文件或目录
os.stat(path) #返回文件所有属性
os.listdir(path) #返回path目录下的文件和目录列表
os.mkdir(path) #创建目录
os.makedirs(path1/path2...) #创建多级目录
os.rmdir(path) #删除一个目录
os.removedirs(path1/path2...) #删除多级目录
os.getcwd() #返回当前工作目录
os.chdir(path) #把path设为当前工作目录
os.walk() #遍历目录树
os.sep #当前操作系统所使用的路径分隔符

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

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

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

shutil模块(拷贝和压缩):
相当于os模块的补充

import shutil
#拷贝
shutil.copyfile('文件名')
shutil.copytree('路径名', '新路径名', ignore = shutil.ignore_patterns('*.txt', '*.csv')) #如果目录已存在,报错

#压缩
shutil.make_archive('压缩去哪/压缩包名字', '压缩的格式', '压缩的内容')

递归算法:
递归结构包括两部分:
定义递归头:什么时候不用调用自身,没有头将陷入死循环
递归体:什么时候调用自身

#之前的例子,阶乘
def fac(n):
    if n == 1:
        return 1
    else:
        return n * fac(n - 1)

#循环的写法
a = int(input())
num = 1
while a > 0:
    num *= a
    a -= 1

#递归展示目录树
import os
allFiles = []
def getFiles(path, level):
    childFile = os.listdir(path)
    for file in childFile:
        filepath = os.path.join(path, file)
        if os.path.isdir(filepath):
            getFiles(filepath, level + 1)
        allFiles.append('\t' + level + filepath)
        
getFiles('目标目录', level)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值