2020-11-13 文件读写、os模块及递归函数

1411-李同学

发表文章数:148

热门标签

首页 » Python » 正文

一、file文件操作

文本文件:存储的是普通字符文本,默认为unicode字符集。可以使用记事本打开

二进制文件:把数据内容用字节进行存储,无法使用记事本打开。

文件模块相关操作:

  • os模块:基本操作系统,主要为了文件操作

  • Io模块:文件流的输入和输出操作

  • cvs模块:用于cvs文件处理

  • pickle:用于序列化和反序列化

  • fileinput:处理多个输入文件

创建文件对象 open():f=open(r“path”,“a”)

  • r:读模式

  • w:写模式

  • a:追加模式,文件不存在创建,文件存在,再文件末尾追加内容

  • b: 二进制模式

如果没有追加b,创建的是文本文件对象,加入b创建的是二进制文件对象,处理的基本单元是字节。

文件的写入步骤:

  • 创建文件对象

  • 写入数据

  • 关闭文件对象

#简单文件的写入步骤
f = open(r"path","a")
s="abc"
f.write(s)
f.close()

二、编码知识

常用编码介绍

ASCII: 表示现代英语及其他西欧语言

兼容 utf-8,gbk。

unicode: 万国码,2个字节表示一个字符。Python默认为unicode。

gbk: 英文一个字节,汉字两个字节。 utf-8:英文一个字节,汉字三个字节。

中文乱码问题

windows默认gbk,linux默认utf-8.当我们打开时,以gbk打开 所以是乱码。

f=open(r“path“,“w”,encoding=“utf-8”)

三、关闭流要点

使用异常机制

write和writelines

writelines:把列表写入文件中,不添加换行符。自己手动换行

close()关闭流

使用finally或者with关键字实现无论何种情况都能关闭打开的文件对象。

#使用异常机制管理文件对象
try:
    f = open(r"path","a")
    s="abc"
    f.write(s)
except BaseException as  e:
    print(e)
finally:
    f.close()

with上下文管理

with open(r"path",“w”)as f

 f.writelines(f)

Note:如果要在一个程序中打开多个文件,f1,f2要区分开。、

四、文本文件的读取

  • read: 从文件中读取size个字符,不传的话默认读取整个文件。

  • readline:读取一行内容作为一个结果返回。

  • readlines:每一行作为一个字符串存入列表,返回该列表。

结构:

with open(r"path","r",encoding=""utf-8) as f:

五、enumerate()函数

#推导式生成列表
'''with open(r"D:/MongoDB/a.txt","w") as f:
    a="james/njordan/nkobe/n"
    f.write(a)
'''
with open(r"D:/MongoDB/a.txt","r",encoding="utf-8") as f1:
    lines=f1.readlines()
    c=[line.rstrip()+"#"+str(index) +"/n" for index,line in enumerate(lines)]
    print(c)


with open(r"D:/MongoDB/a.txt","w",encoding="utf-8") as f1:
    f1.writelines(c)

六、二进制文件的读写

  • wb

  • ab

  • rb

七、 文件的拷贝

with open("aa.gif","rb") as f:
    with open("aacopy.gif","wb") as w:
        for line in f.readlines():
            w.write(line)

print("图片拷贝完成")

八、文件对象常用属性方法和总结

  • 文件对象的属性:name,mode,closed

  • 文件对象的打开模式: r,w,a,b

  • 文件对象的常用方法:read, readline, readlines, write, writelines(未添加换行符), seek, close.

  • seek(offset,whence); whence: 0:从文件头开始计算,1:从当前位置开始,2:从尾部开始

#测试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(3) #偏移
    print("读取的内容:{0}".format(f.readline()))

九、使用pickle序列化

  • pickle.dump(obj,file) obj就是要被序列化的对象,file指的是要存储的文件。

  • pickle.load(file) 从file读取数据,反序列化对象。

import pickle
with open("a.txt","wb") as f:
    a1="lixuan"
    a2=234
    a3=[20,30,40]

    pickle.dump(a1,f)
    pickle.dump(a2,f)
    pickle.dump(a3,f)
#反序列化
import pickle
with open("a.txt","rb") as f:
    a1=pickle.load(f)
    a2=pickle.load(f)
    a3=pickle.load(f)

    print(a1,a2,a3)

十、csv文件的读写

概念:csv十逗号分隔符文本格式。

  • 只能处理简单字符串

  • 不能嵌入图片

  • 无字体颜色,无单元格宽高设定

#测试csv文件读取和写入
import csv
with open("dd.csv","r") as f:
    a=csv.reader(f)
    for row in a:
        print(row)

with open ("ee.csv","w") as f:
    b_csv=csv.writer(f)
    b_csv.writerow(["id","name","age"])
    b_csv.writerow(["01", "lixuan", "20"])

十一、os模块

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

os.system 可以帮助我们直接调用系统的命令

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

os.path模块

  • isabs:判断绝对路径

  • isdir: 判断是否为目录

  • isfile: 判断是否为文件

  • exists: 判断是否存在

  • abspath: 返回绝对路径

  • getsize:返回文件的大小

  • join:连接多个path

  • split 对路径进行分割,以列表形式返回

  • walk 递归遍历目录

#测试os.path。

import os


#判断
print(os.path.isabs("d:/MongoDB/a.txt"))
print(os.path.isdir("d:/MongoDB/a.txt"))
print(os.path.isfile("d:/MongoDB/a.txt"))
print(os.path.exists("d:/MongoDB/a.txt"))

#获得文件基本信息
print(os.path.getsize("d:/MongoDB/a.txt"))
print(os.path.abspath("d:/MongoDB/a.txt"))
print(os.path.dirname("d:/MongoDB/a.txt"))

#对路径的操作

path=os.path.abspath("a.txt")
print(os.path.split(path)) #将最后一层切出来
print(os.path.splitext(path)) #返回文件扩展品
print(os.path.join(path,"aa")) #将两个路径连接

walk方法遍历所有文件

os.walk() 返回一个三个元素的元组

  • dirpath

  • dirnames

  • filenames

#测试os.walk()

import os

path=os.getcwd()
listFiles=os.walk(path)
for dirpath,dirnames,filenames in listFiles:
    for dir in dirnames:
        print(dir)

    for file in filenames:
        print(os.path.join(dirpath,file))

十二、shutil 模块

文件的拷贝

概念:shutil模块是用来做文件拷贝,移动删除以及压缩解压缩操作

import shutil

shutil.copyfile("a.txt","b.txt")

#目录的拷贝

shutil.copytree("redis","redis1")

文件的压缩和解压缩

import shutil
import zipfile
#压缩文件
shutil.make_archive("redis1/yasuo","zip","redis")

#解压缩与压缩

z1=zipfile.ZipFile("d:/a.zip","w")
z1.write("a.txt")
z1.close()


z2=zipfile.ZipFile("d:/a.zip","r")
z2.extractall("redis1")
z2.close()

十三、递归算法原理

概念:递归结构包括两个部分

本质:直接或间接的调用自己

  • 定义递归头

  • 递归体

遍历一个目录下的所有文件:

#遍历一个目录下所有的文件

import os

def listFile(path,sp=""):
    fileList=os.listdir(path)
    sp+=" "
    for fileName in fileList:
        abs=os.path.join(path,fileName)
        if os.path.isdir(abs):
            print(sp+"目录名:",abs)
        else:
            print(sp+"文件名:",fileName)


path=r"d:/MongoDB"
listFile(path)

fileList1=[fileName for fileName in os.listdir(path) if fileName.endswith(".py")]
for f in fileList1:
    print(f,end="/n")
标签:

未经允许不得转载:作者:1411-李同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《2020-11-13 文件读写、os模块及递归函数》 发布于2020-11-13

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录