实际开发中,我们经常需要从外部存储介质(硬盘、光盘、U 盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存,很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的。

一、基础内容

1.文件类型

按文件中数据组织形式,文件分为文本文件和二进制文件两大类。
①文本文件
        文本文件存储的是普通“字符”文本,python 默认为unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像word 软件编辑的文档不是文本文件
②二进制文件
        二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。

2.文件操作相关模块

3.创建文件对象open()

open()函数用于创建文件对象,基本语法格式如下:
                                                        open(文件名[,打开方式])
        如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
                                                        f = open(r"d:\b.txt","w")

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

二、文本文件的写入

1.基本的文件写入操作

文本文件的写入一般就是三个步骤:
        ①创建文件对象
        ②写入数据
        ③关闭文件对象

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

2.常用编码

只有在编码相同或者兼容时,才不会出现乱码现象。常用编码之间的关系如下:

这些编码均是自下而上兼容的,国内常用的是GB2312和GBK,Unicode又称为万国码,但采用定长编码,在程序(大多均为字母和字符)中占内存大,所以可以把Unicode看做是表示、设计,而UTF-8是对它的实现。

一般项目都会使用UTF-8。unicode 中虽然汉字是两个字节,UTF-8 中汉字是3 个字节。但是互联网中一个网页也包含了大量的英文字母,这些英文字母只占用1 个字节,整体占用空间,UTF-8 仍然由于Unicode。

3.中文乱码问题

windows 操作系统默认的编码是GBK,Linux 操作系统默认的编码是UTF-8。当我们用open()时,调用的是操作系统打开的文件,默认的编码是GBK。所以采用编码为unicode的python操作时会出现乱码,改为GBK即可显示正常,但在Linux操作系统不会出现此问题。

f = open(r"b.txt", "w")
f.write("我爱你\n好想你\n")
f.close()
打开文件可以发现:
�Ұ���
������

另外,也可以通过指定文件编码解决中文乱码问题:

f = open(r"b.txt", "w", encoding="utf-8")
f.write("我爱你\n好想你\n")
f.close()

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()

5.close()关闭文件流

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用close()方法关闭文件对象。当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。
        为了确保打开的文件对象正常关闭,一般结合异常机制的finally 或者with 关键字实现无论何种情况都能关闭打开的文件对象。

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

6.with 语句(上下文管理器)

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

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

三、文本文件的读取

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

 ①read([size])
        从文件中读取size 个字符,并作为结果返回。如果没有size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。中文也算1个字符。
        ②readline()
        读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
        ③readlines()
        文本文件中,每一行作为一个字符串存入列表中,返回该列表

# 读取一个文件前4 个字符
with open(r"bb.txt","r",encoding="utf-8") as f:print(f.read(4))
# 文件较小,一次将文件内容读入到程序中
with open(r"d:\bb.txt","r") as f:print(f.read())
# 按行读取一个文件
with open(r"bb.txt","r") as f:while True:fragment = f.readline()if not fragment:breakelse:print(fragment,end="")
# 使用迭代器(每次返回一行)读取文本文件
with open(r"d:\bb.txt","r") as f:for a in f:print(a,end="")

enumerate()函数用于枚举,以元组形式把每一个元素都与索引联系起来放入列表。

rstrip()用于去除右空白符。

为文本文件每一行的末尾增加行号:

with open(r"a", "r", encoding="utf-8") as f:lines = f.readlines()lines = [line.rstrip() + " #" + str(index+1) + "\n" for index, line in enumerate(lines)]with open(r"a", "w", encoding="utf-8") as f:f.writelines(lines)

四、二进制文件的读取和写入

二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:
        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('aa.gif', 'rb') as f:with open('aa_copy.gif', 'wb') as w:for line in f.readlines():w.write(line)print('图片拷贝完成!')

五、文件对象其他操作、属性和方法

1.常用属性和方法(seek具体操作)

属性:

打开模式:

常用方法:

seek()移动文件指针:seek(offset[,whence]):

把文件指针移动到新的位置,offset 表示相对于whence 的多少个字节的偏移量;
        offset:off 为正往结束方向移动,为负往开始方向移动
        whence 不同的值代表不同含义:
                0: 从文件头开始计算(默认值)
                1:从当前位置开始计算
                2:从文件尾开始计算

with open("e.txt","r",encoding="utf-8") as f:print("文件名是:{0}".format(f.name))print(f.tell())  # 指针当前位置print("读取的内容:{0}".format(str(f.readline())))print(f.tell())f.seek(0,0)  # 指针移动到文件开头位置print("读取的内容:{0}".format(str(f.readline())))

2.使用pickle 序列化

对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。对象的序列化机制广泛的应用在分布式、并行系统上。
        序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
        序列化我们使用:
        pickle.dump(obj, file)         obj 就是要被序列化的对象,file 指的是存储的文件
        pickle.load(file)         从file 读取数据,反序列化成对象

将对象序列化到文件中并将获得的数据反序列化成对象:

import pickle
with open(r"d:\data.dat","wb") as f:a1 = "高一"a2 = 234a3 = [20,30,40]pickle.dump(a1,f)pickle.dump(a2, f)pickle.dump(a3, f)with open(r"d:\data.dat","rb") as f:a1 = pickle.load(f)a2 = pickle.load(f)a3 = pickle.load(f)print(a1)print(a2)print(a3)

六、CSV 文件的操作

csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。与Excel 文件不同,CSV 文件中:
                                值没有类型,所有值都是字符串
                                不能指定字体颜色等样式
                                不能指定单元格的宽高,不能合并单元格
                                没有多个工作表
                                不能嵌入图像图表

Python 标准库的模块csv 提供了读取和写入csv 格式文件的对象。

csv.reader 对象于从csv 文件读取数据
        csv.writer 对象写一个csv 文件

import csvwith open("dd.csv", "r", encoding="utf-8") as f:a_csv = csv.reader(f)  # 创建csv 对象,它是一个包含所有数据的列表,每一行为一个元素#  print(list(a_csv))for row in a_csv:  # 循环打印各行内容print(row)with open("ee.csv", "w", encoding="utf-8") as f:b_csv = csv.writer(f)  # 创建csv 对象b_csv.writerow(["ID", "姓名", "年龄"])  # 写入一行(标题)b_csv.writerow(["1", "大一", "18"])c = [["2", "大二", "19"], ["3", "大三", "20"]]b_csv.writerows(c)  # 写入多行(数据

七、os 和os.path 模块

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

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

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

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

import osos.system("notepad.exe")  # 调用记事本程序
os.system("ping www.baidu.com")  # ping命令
os.system("cmd")  # 命令提示符os.startfile(r"E:\Program Files (x86)\Tencent\WeChat\WeChat.exe")  # 直接调用可执行文件

【注】Linux 是命令行操作更容易,我们可以通过os.system 可以更加容易的调用相关的命令;
        【注】控制台输出中文可能会有乱码问题,可以在file-->setting 中设置,搜索file encoding设置改为GBK编码(windows系统)

2.os 模块-文件和目录操作

需要对文件和目录做其他操作,可以使用os 和os.path 模块。

常用操作文件的方法:

关于目录操作的相关方法:

import os# 获取文件和文件夹相关的信息
print(os.name)  # 系统名称:windows->nt    linux和unix->posix
print(os.sep)  # 路径分隔符:windows->\    linux和unix->/
print(repr(os.linesep))  # 行终止符:windows->\r\n    linux和unix->\n\
# repr()将对象转化为供解释器读取的形式
print(os.stat("file01.py"))  # 获取文件相关信息# 关于工作目录的操作
print(os.getcwd())  # 返回当前工作目录:current work dir
os.chdir("d:")  # 改变当前工作目录为:d:盘根目录# 创建目录,多级目录,删除
os.mkdir("book")  # 创建新的目录
os.rmdir("book")  # 删除目录
os.makedirs("movies/book/star")  # 创建多级目录
os.removedirs("movies/book/star")  # 删除多级目录,若目录不为空则无法删除
os.makedirs("../movies/book/star")  # ../指的是上一级目录
os.rename("movies", "movie")  # 修改目录名称
dirs = os.listdir("movie")  # 返回path 目录下的文件和目录列表
print(dirs)

3.os.path 模块

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

测试常用方法:

import os
import os.path  # from os import path  # 这样导入后面可以直接用path.无需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("d:/a.txt"))
# 获得文件基本信息
print(os.path.getsize("b.txt"))
print(os.path.abspath("b.txt"))
print(os.path.dirname("d:/a.txt"))
print(os.path.getctime("b.txt"))  # 返回文件的创建时间
print(os.path.getatime("b.txt"))  # 返回文件的最后访问时间
print(os.path.getmtime("b.txt"))  # 返回文件的最后修改时间
# 对路径的操作
path = os.path.abspath("b.txt")
print(os.path.split(path))  # 对路径进行分割,以列表形式返回
print(os.path.splitext(path))  # 从路径中分割文件的扩展名
print(os.path.join("aa", "bb", "cc"))  # 连接多个path

列出指定目录下所有的.py 文件,并输出文件名:

import os.pathpath = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:if filename.endswith("py"):print(filename, end="\t")file_list2 = [filename for filename in os.listdir(path) if filename.endswith("py")]
for f in file_list2:print(f, end="\t")

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

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

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

import osall_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)

八、shutil 模块(拷贝和压缩)

1.拷贝

import shutilshutil.copyfile("1.txt", "1_copy.txt")  # 复制1.txt文件命名为1_copy.txt
shutil.copytree("movie/港台", "电影")  # 把港台文件夹和内容拷贝到电影目录下,只能拷贝不存在的目录,即电影目录不存在
shutil.copytree("movie/港台", "电影", ignore=shutil.ignore_patterns("*.txt", "*.html"))
# 可以忽略不需要格式的文件,拷贝需要的文件

2.压缩

shutil模块和zipfile模块可以实现文件的压缩,zipfile还可以实现文件的解压缩。

import shutil
import zipfileshutil.copyfile("1.txt", "1_copy.txt")
shutil.copytree("movie/港台", "电影")  # 只能拷贝不存在的目录,即电影目录不存在
shutil.copytree("movie/港台", "电影", ignore=shutil.ignore_patterns("*.txt", "*.html"))
# 可以忽略不需要格式的文件,拷贝需要的文件shutil.make_archive("电影/gg", "zip", "movie/港台")  # 压缩文件,("压缩文件位置命名", "压缩文件格式", "要压缩的内容")
z1 = zipfile.ZipFile("a.zip", "w")  # 使用zipfile也可实现文件压缩
z1.write("1.txt")
z1.write("1_copy.txt")
z1.close()z2 = zipfile.ZipFile("a.zip", "r")  # 文件解压缩
z2.extractall("电影")
z2.close()

九、递归算法

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

递归结构包括两个部分:
        ①定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就
是递归的结束条件。
        ②递归体。解答:什么时候需要调用自身方法。

1.阶乘计算

def factor(n):if n == 1:return nelse:return n * factor(n-1)print(factor(5))

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

2.目录树结构展示

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

Python学习第9天——文件操作相关推荐

  1. python学习(九)文件操作

    一.文件操作简介 Python 提供了必要的函数和方法进行默认情况下的文件基本操作.你可以用 file 对象做大部分的文件操作. 1.打开文件: Python内置了一个打开文件的函数,open()函数 ...

  2. Python学习笔记三(文件操作、函数)

    一.文件处理 1.文件打开模式 打开文本的模式,默认添加t,需根据写入或读取编码情况添加encoding参数. r   只读模式,默认模式,文件必须存在,不能存在则报异常. w  只写模式,若文件不存 ...

  3. 我的python学习(五)文件操作、异常捕获

    读写.创建文件 文件的分类: 文本文件:基于字符编码,存储的是普通字符串,不包括字体.字号.样式.颜色等信息,可通过文本编辑器显示和编辑,例如txt文件: 二进制文件:基于值编码的,以字节形式存储,其 ...

  4. 【Python学习笔记】- 04 文件操作

    对文件的操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 准备一个待读取的文件 <斗破苍穹>是一本连载于起点中文网的古装玄幻小说,作者是起点白金作家天蚕土 ...

  5. Python学习之路5☞文件处理

    Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...

  6. Python学习笔记D9(文件)

    Python学习笔记D9(文件) 文件 1.打开文件 open(file, mode='r') 接收两个参数:文件名(file)和模式(mode),用于打开一个文件,并返回文件对象,如果该文件无法被打 ...

  7. python开发_xml.etree.ElementTree_XML文件操作

    python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用 xml.etree.ElementTree模块实现了一个简单而有效的用户解析和 ...

  8. Linux_红帽8学习笔记分享_3(文件操作管理)

    Linux_红帽8学习笔记分享_3(文件操作管理) 文章目录 Linux_红帽8学习笔记分享_3(文件操作管理) 1.Vi编辑器 1.1两种模式 1.2十种技巧 2.用户的家目录 2.1 su命令的使 ...

  9. Python学习入门基础:文件读写操作、模块和包、异常

    一.文件 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

最新文章

  1. linux基础命令介绍十四:定时任务
  2. 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
  3. 《剑指offer》扑克牌顺序
  4. 0xbc指令 st75256_CIRCUIT-BREAKER GEB3160FFM
  5. jzoj1882-亲戚【并查集】
  6. 1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据
  7. android手机 不显示本地视频,各位大神们 android怎么获取手机本地视频啊?
  8. Eclipse右下角一直提示Computing additional info解决办法
  9. C++实现 电子邮件客户端程序(简易版)
  10. 集合对象转json数组
  11. “我们检测到您之前将硬盘移动到新的DS3617xs。如果您要现在还原数据和设置,请单击“还原” 解决办法
  12. 目标跟踪 | 目标跟踪算法总结
  13. Swagger、Rap与Yapi接口管理
  14. Python实用模块
  15. BELLHOP 关于Actup冲激响应的绘制
  16. 写一个强化学习训练的gym环境
  17. 基于决策树对鸢尾花进行分类
  18. WebSocket 协议以及 Socket 接口
  19. 接口性能测试方案 白皮书 V1.0
  20. 统计英文句子中有多少个英文单词 单词之间用空格分开

热门文章

  1. Vue2基础篇教程合集
  2. win7计算机无法识别分辨率,win7系统的分辨率不能调整的三大原因及解决方法
  3. 图片压缩到200k以内怎么操作?图片压缩指定大小工具推荐
  4. 计算机毕业设计JAVA病房管理系统mybatis+源码+调试部署+系统+数据库+lw
  5. svm算法python实现_(转载)python应用svm算法过程
  6. linux防火墙开启udp,Linux防火墙开放端口
  7. Flash CS3动画设计150例
  8. HTML奥运网页5页面文化 ~ 体育学生网页设计作业 ~ HTML+CSS+JS网页设计期末课程大作业 ~ web前端开发技术 ~ web课程设计网页规划与设计
  9. Java设计模式——桥接模式
  10. firewalld的基础操作命令