文件操作就是把文件从硬盘搬到内存里面,再用代码命令对文件内容进行修改。
文件分为文本文件和二进制文件。按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类。能用记事本打开且没有乱码的基本上就是文本文件;用记事本打开但是出现乱码的一般是二进制文件。
1,文本文件存储的是普通“字符”文本,python默认是 unicode 字符集(两个字节表示一个字符,最多可以表示:65536个),可以使用记事本程序打开。
2 ,二进制文件,二进制文件把数据内容用“字节byte”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文件、JPG图片、doc文档等等。
下图列举了各种python中处理文件的标准库和第三方库。
目录
一,创建文件对象
二,各种编码
三,文本文件的写入
1,一次性输入一个字符串
2,一次性输入多个字符串
四, 文本文件的读取
五,二进制文本的读取与写入
六,文件对象的属性与常用方法
七,使用seek()方法和tell()进行定位
八,CSV文件的操作
九,os模块
1,os.system()方法
2,os模块操作文件的方法如下
3,os模块操作文件夹和操作路径的方法
十,os.path模块
1,使用walk函数递归遍历所有文件的目录
十一,shutil模块(拷贝和压缩)
十二,pickle序列化
十三,遍历生成树状文件图
一,创建文件对象
对文件进行操作之前,需要把文件从硬盘读取到内存中,并且告诉我们文件放在了内存的哪个位置。使用open()函数来实现这个功能。
open() 函数用于创建文件对象,基本语法格式如下:open(文件名[,打开方式]),如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如: D:\a\b.txt,为了减少 \ 的输入,可以使用原始字符串: r“d:\b.txt” ,示例如下:f = open(r"d:\b.txt","w")。
关于文件名概括就是一句话:告诉解释器文件的具体存在硬盘哪个地方。
常见的文件打开方式如下图:
打开方式的一般格式为:读/写/追加 + b/没有b + 没有+/有+。例如r+;rb+;w+;wb+;wb;rb;a+;ab+等。
1 ,如果没有增加模式 b ,则默认创建的是文本文件对象,处理的基本单元是“字符”。
2,如果是二进制模式 b ,则创建的是二进制文件对象,处理的基本单元是“字节”。
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
上面的代码是open()函数在系统中的定义,file参数是打开文件的路径,需要给file一个路径字符串作为参数;mode是打开方式,默认为只读'r',需要传一个字符串给mode,不过这个字符串要符合打开方式;encoding是编码方式。open()函数成功调用完成后,返回一个文件对象。
下面用一个文件做测试,测试文件内容如下图:
f = open(file='except.txt', mode='r+', encoding='utf-8')
print(f)
# <_io.TextIOWrapper name='except.txt' mode='r+' encoding='utf-8'>
文件对象是一个可迭代对象。里面的每一个元素是文件里的一行,也就是没迭代一次就拿出一行。
f = open(file='except.txt', mode='r+', encoding='utf-8')
for line in f:
print(line, end='')
# Traceback (most recent call last):
# File "C:/Users/.PC/PycharmProjects/TEST/49.py", line 5, in <module>
# a = 1 / 0
# ZeroDivisionError: division by zero
二,各种编码
下面的图展示了各种编码的关系。
这些都不用管,只需要记住两点:1,不管是啥场景, 都用UTF-8;2,Windows默认使用GBK编码。编码的实质就是:不同地区和国家为在计算机中储存自己家的文字字符,设计出的不同字符的索引编号。
三,文本文件的写入
文件写入分三步:1,正常打开文件从而把文件放到内存里;2,对内存里的文件对象进行增删改;3,关闭文件,也就是把文件从内存中搬到硬盘上。
那么如何写呢?就像我们在WPS中码word一样:有时候一个字一个字的敲;有时候一行一行的复制别人的;有时候一段一段的复制;有时候在开头加几个字,有时候在结尾加几个字。我们可以在文章的任何位置进行增删改查,靠的是什么呢?在word中靠的是鼠标光标的位置。如果把文件放在内存里,我们看也看不到,如何定位呢?靠的是文件对象的seek()函数来进行定位。
1,一次性输入一个字符串
使用文件对象的write()方法可以一次性输入一个或多个字符,也就是一次性输入一个字符串。
f = open(file='test.txt', mode='w+', encoding='utf-8')
f.write('666')
f.close()
但是推荐使用with语句块,方便快捷。
with open(file='test.txt', mode='w+', encoding='utf-8') as f:
f.write('666')
2,一次性输入多个字符串
使用文件对象的writeline()方法,该方法接收一个列表作为参数,而且这个列表里必须全部存的是字符串。
with open(file='test.txt', mode='w', encoding='utf-8') as f:
li = ['我\n', '爱\n', '你']
f.writelines(li)
四, 文本文件的读取
文件的读取一般使用如下三个方法:
1,read([size]),从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
2 ,readline(),读取一行内容作为结果返回。读取到文件末尾,会返回空字符串
3 ,readlines(),文本文件中,每一行作为一个字符串存入列表中,返回该列表
五,二进制文本的读取与写入
二进制文本就是文件内容全是二进制0和1,需要特定的算法进行解码分析才能得到我们看得懂或者计算机能够识别的内容。
对二进制文件的操作,和操作文本文件一样,只不过打开方式需要加上b。
六,文件对象的属性与常用方法
文件对象常见的三种属性如下图:
文件对象常用的方法如下:
七,使用seek()方法和tell()进行定位
这个定位和我们用鼠标光标定位一个意思。
with open(file='test.txt', mode='w', encoding='utf-8') as f:
print(f.name, f.mode, f.closed)
print(f.tell())
f.seek(5, 0) # offset表示偏移,但是他表示偏移的字符数是英文的,一个汉字抵得上两个英文字符
print(f.tell())
八,CSV文件的操作
CSV文件的介绍如下:
总结来说就是:将excel里的单元格数据拿出来用逗号隔开,形式与表格一样,只不过是去掉表格用逗号,和换行来表示。
import csv
with open(file='test.csv', mode='r+', encoding='utf-8') as f:
csv_f = csv.reader(f)
header = next(csv_f) # 获取标题选项
print(header)
for ran in csv_f: # 打印条目信息
print(ran)
# ['姓名', '年龄', '工作', '薪水']
# ['A', '18', '程序员', '50000']
# ['B', '19', '测试工程师', '20000']
# ['C', '20', '人工智能开发', '50000']
如果对csv文件进行写入,也必须按照先给出标题选项,在给出条目的形式。
九,os模块
os,即操作系统。os模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。
1,os.system()方法
该方法可以调用系统命令,比如运行硬盘上的exe程序,计算器记事本等。或者进行网络延迟测试。类似于在cmd中一样。
import os
os.system('notepad.exe')
os.system('ping www.baidu.com')
2,os模块操作文件的方法如下
3,os模块操作文件夹和操作路径的方法
上面的方法都是针对.py文件运行的文件夹或者使用cd命令进入或者用chdir进入的文件夹。chdir全称change directory。 在Windows中sep为‘\’,也就是路径分割符为反斜杠。一般路径作为参数都是以字符串的形式。
十,os.path模块
os.path提供了关于路径的一些常用方法,实际上就是对字符串的处理。
1,使用walk函数递归遍历所有文件的目录
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
walk(top, topdown=True, onerror=None, followlinks=False)
top:指的是想要遍历的最顶层目录,这个目录里面还有其他的的子目录和文件。执行过程就是,先找出top目录下的文件夹和文件,再对找到的目录进行同样的查找。
walk函数的关键在于他的返回结果,他返回一个三元组,每个元组里有三个数据元素,分别是root,dirs,files。
使用walk函数打印出指定文件夹下的所有文件夹和目录:
代码如下:
import os
import os.path
# 递归遍历目录树
def my_print_file(path, level=0):
child_files = os.listdir(path) # 获取当前目录下所有的文件和文件夹名称,并存入列表中
for file in child_files:
file_path = os.path.join(path, file) # 变量当前文件夹下的目录和文件,进行层级打印。
print("\t" * level + file_path[file_path.rfind(os.sep) + 1:])
if os.path.isdir(file_path): # 判断当前路径是否为文件夹,如果是则为子文件夹,需要进入子文件夹进行同样的遍历
my_print_file(file_path, level + 1) # 随着一层一层的深入,记得把层级加1,打印出树状图
my_print_file(os.getcwd()) # 把.py文件运行的目录作为top目录
a = input() # 暂停,观察结果
运行结果如下:
由上面的代码可以发现,walk函数执行顺序如下:①把C:\360Safe作为root,搜索该文件夹的的文件夹有SoftMgr,将其放在dirs里,将搜索得到的walk函数.py放在files里;②由递归,把SoftMgr文件夹作为root再继续搜索得到两个exe文件,将他们放在files里……直到把所有文件夹都当成root试一遍,然后把所有结果存在一个生成器里面,每次返回一个三元组。
十一,shutil模块(拷贝和压缩)
shutil 模块是python标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。os 模块提供了对目录或文件的一般操作。 shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些 os 模块都没有提供。
十二,pickle序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用pickle模块中的函数,实现序列化和反序列操作。
Python中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。
使用方法如下:
import pickle
with open(file='pic.txt', mode='wb+') as f:
pickle.dump('我爱你666', f)
with open(file='pic.txt', mode='rb+') as f:
print(pickle.load(f))
十三,遍历生成树状文件图
import os
import os.path
# 递归遍历目录树
def my_print_file(path, level=0):
child_files = os.listdir(path) # 获取当前目录下所有的文件和文件夹名称,并存入列表中
for file in child_files:
file_path = os.path.join(path, file) # 变量当前文件夹下的目录和文件,进行层级打印。
print("\t" * level + file_path[file_path.rfind(os.sep) + 1:])
if os.path.isdir(file_path): # 判断当前路径是否为文件夹,如果是则为子文件夹,需要进入子文件夹进行同样的遍历
my_print_file(file_path, level + 1) # 随着一层一层的深入,记得把层级加1,打印出树状图
my_print_file(os.getcwd()) # 把.py文件运行的目录作为top目录
a = input()