Python文件
目录
文件分类
按文件中数据组织形式,分为文本文件和二进制文件两大类:
- 文本文件
文本文件存储的是普通“字符”文本,python 默认为unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开
但是,像word 软件编辑的文档不是文本文件 - 二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码
常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等
常用编码介绍
Python程序运行时默认Unicode
windows 操作系统默认的编码是GBK,Linux 操作系统默认的编码是UTF-8
open()时,调用的是操作系统打开的文件,默认的编码是系统编码
f = open(r"b.txt",“w”,encoding=“utf-8”)
Python标准库中的文件操作相关模块
使用pickle序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方;反序列化是指相反的过程,将读取到的“串行化数据”转化成对象
- pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
- pickle.load(file) 从file 读取数据,反序列化成对象
os和os.path模块
对操作系统进行操作,直接调用操作系统的文件、命令,直接操作文件、目录等
os.system调用系统命令
>>>import os
>>> os.startfile(r"C:\Program Files\XMind\XMind.exe")
os模块文件和目录操作**
文件操作:
目录操作:
# coding=utf-8
# 测试os 模块中,关于文件和目录的操作
import os
# 获取文件和文件夹相关的信息
print(os.name) # windows->nt linux 和unix->posix
print(os.sep) # windows->\ linux 和unix->/
print(repr(os.linesep)) # windows->\r\n linux-->\n\
print(os.stat("test.py")) # 获取文件信息
# 关于工作目录的操作
print(os.getcwd())
os.chdir("d:") # 改变当前的工作目录为:d:盘根目录
os.mkdir("subfield")
# 创建目录、创建多级目录、删除
os.mkdir("subfield")
os.rmdir("subfield") #相对路径都是相对于当前的工作目录
os.makedirs("subfield/subsubfield")
os.removedirs("subfield/subsubfield") #只能删除空目录
os.makedirs("../subfield/subsubfield") #../指的是上一级目录
os.rename("subfield","subfolder")
dirs = os.listdir("subfolder")
print(dirs)
walk() 递归遍历所有文件和目录
#coding=utf-8
# dirpath:要列出指定目录的路径
# dirnames:目录下的所有文件夹
# filenames:目录下的所有文件
import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
# all_files.append(dir)
all_files.append(os.path.join(dirpath,dir))
for name in filenames:
# all_files.append(name)
all_files.append(os.path.join(dirpath,name))
#打印子目录和子文件
for file in all_files:
print(file)
os.path模块
#测试os.path 常用方法
import os
import 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("a.txt")) #文件是否存在
print(os.path.getsize("a.txt")) #文件大小
print(os.path.abspath("a.txt")) #输出绝对路径
print(os.path.dirname("d:/a.txt")) #输出所在目录
########获得创建时间、访问时间、最后修改时间##########
print(os.path.getctime("a.txt")) #返回创建时间
print(os.path.getatime("a.txt")) #返回最后访问时间
print(os.path.getmtime("a.txt")) #返回最后修改时间
################对路径进行分割、连接操作####################
path = os.path.abspath("a.txt") #返回绝对路径
print(os.path.split(path)) #返回元组:目录、文件
('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os', 'a.txt')
print(os.path.splitext(path)) #返回元组:路径、扩展名
('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os\\a','.txt')
print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc
#coding=utf-8
#列出指定目录下所有的.py 文件,并输出文件名
import os
import os.path
path = os.getcwd()
file_list = os.listdir(path) #列出子目录和子文件
for filename in file_list:
pos = filename.rfind(".")
if filename[pos+1:]=="py":
print(filename,end="\t")
print("##################")
file_list2 = [filename for filename in os.listdir(path) if filename.endswith(".py") ]
for filename in file_list2:
print(filename,end="\t")
shutil 模块
shutil 模块是python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作
import shutil
import zipfile
shutil.copyfile("1.txt","1_copy.txt") #copy 文件内容
shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm")) #将文件夹“电影/学习”下面的内容拷贝到文件夹“音乐”下;拷贝时忽略所有的html 和htm 文件;音乐文件夹需要不存在!!!
z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close() # 压缩:将指定的多个文件压缩到一个zip 文件
shutil.make_archive("音乐2/movie","zip","电影/学习") # 将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成movie.zip
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") #设置解压的地址
z2.close() # 解压缩
文本文件
文本文件写入
文本文件的写入一般就是三个步骤:
- 创建文件对象
- 写入数据
- 关闭文件对象
write(a):把字符串a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
open()
open(文件名[,打开方式])
模式 | 描述 |
---|---|
r | read |
w | write;如果文件不存在,则创建;如果文件存在,则重写内容 |
a | append;如果文件不存在,则创建;如果文件存在,则在文件末尾追加内容 |
b | binary;如果没有指定b,则默认文本文件,处理的基本单元是字符;如果设置b,则创建二进制文件对象,处理的基本单元是字节 |
+ | 读、写模式 |
close()
由于文件底层是由操作系统控制,所以打开的文件对象必须显式调用close()方法关闭文件对象
当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象
为了确保打开的文件对象正常关闭,一般结合异常机制的finally 或者with 关键字实现无论何种情况都能关闭打开的文件对象。
# finally
try:
f = open(r"my01.txt","a")
str = "test"
f.write(str)
except BaseException as e:
print(e)
finally:
f.close
# with
with open(r"d:\bb.txt","w") as f:
f.writelines("test")
文本文件读取
- read([size]):从文件中读取size 个字符,并作为结果返回;如果没有size 参数,则读取整个文件;读取到文件末尾,会返回空字符串
- readline():读取一行内容作为结果返回,读取到文件末尾,会返回空字符串
- readlines():文本文件中,每一行作为一个字符串存入列表中,返回该列表
# 迭代器读取
with open(r"d:\bb.txt","r") as f:
for a in f:
print(a,end="") # 结尾不打印换行符
enumerate()
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
with open("e.txt","r",encoding="utf-8") as f:
lines = f.readlines()
lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)] #推导式生成列表
with open("e.txt","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’) #可读的二进制文件对象
CSV文件
csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出
所有值都是字符串,不能定义复杂样式和信息
csv.reader 用于从csv 文件读取数据
import csv
with open(r"d:\a.csv") as a:
a_csv = csv.reader(a) #创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
csv.writer 对象写一个csv 文件
import csv
headers = ["工号","姓名","年龄"]
rows = [("1001","Jason",18),("1002","Anna",19)] # 也可以使用列表
with open(r"d:\b.csv","w") as b:
b_csv = csv.writer(b) #创建csv 对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(rows) #写入多行(数据)
文件对象常用方法和属性
常用属性:
属性 | 说明 |
---|---|
name | 返回文件的名字 |
mode | 返回文件的打开模式 |
closed | 若文件被关闭则返回True |
常用方法:
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str 内容写入文件 |
writelines(s) | 将字符串列表s 写入文件文件,不添加换行符 |
seek(offset | 把文件指针移动到新的位置,offset 表示相对于whence 的多少个 |
[,whence]) | 字节的偏移量;offset:off 为正往结束方向移动,为负往开始方向移动whence 不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 不论指针在什么位置,只留下指针前size 个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |