内容正文:
项目七 文件
Contents
掌握os模块的使用
掌握Python文件的读写
掌握Python数据的处理
os模块的使用
PART 01
通过os模块可以方便地使用操作系统的相关功能。
使用os模块的功能前,需要先通过“import os”将其导入。
查看系统平台
使用“os.name”可以查看当前操作系统的名字,
Windows用字符串 “nt”表示,Linux用字符串“posix”表示。
获取环境变量值
os.environ是一个包含所有环境变量值的映射对象,在Python控制台下直接输入os.environ即可查看当前所有环境变量。
如果要查看某一个环境变量值,则可以采用以下方式:os.environ[key] 或os.getenv(key)
例:查看HOME环境变量的值。os.environ['HOME'] 或os.getenv('HOME')
os模块
4
获取当前系统平台路径分隔符
不同操作系统可能会使用不同的路径分隔符。
例如,Windows系统以'\\'作为路径分隔符,而Linux系统以'/'作为路径分隔符。
使用“os.sep”可以获取当前系统平台的路径分隔符。
获取当前工作目录
使用os.getcwd函数可以获取当前工作目录。
如果要访问当前工作目录下的data子目录中的test.dat文件,则除了可以使用'data'+os.sep+'test.dat'或 'data{sep}test.dat'.format(sep=os.sep)这种相对路径形式外,还可以写为如下的绝对路径形式:
os.getcwd()+os.sep+'data'+os.sep+'test.dat' 或'{cwd}{sep}data{sep}test.dat'.format(cwd=os.getcwd(),sep=os.sep)
如果当前工作目录是"D:\\Python\\Python37",则得到的绝对路径为"D:\\Python\\Python37\\data\\test.dat"。
os模块
5
获取文件和目录列表
使用os.listdir函数可以获取指定路径下的所有文件和目录的名字, os.listdir函数的语法格式为:
os.listdir(path='.')
其中,path是要获取文件和目录名字的路径,默认值'.'表示获取当前路径下的所有文件和目录的名字。
返回值是由path路径下所有文件和目录名字组成的列表。
例如:
os.listdir()
os.listdir(os.getcwd()+os.sep+'DLLs')
会分别获取到当前路径下所有文件和目录名字组成的列表, 以及当前路径的DLLs目录下所有文件和目录名字组成的列表。
os模块
6
创建目录
使用os.mkdir和os.makedirs函数可以根据指定路径创建目录。
os.mkdir和os.makedirs函数的语法格式分别为:
os.mkdir(path)
os.makedirs(path)
其中,path指明了要创建的目录。
例如:
os.mkdir(os.getcwd()+os.sep+'newdir')
os.makedirs(os.getcwd()+os.sep+'subdir1'+os.sep+'subdir2')
程序执行完毕后,第1行代码将在当前工作目录下创建一个名为newdir 的目录;第2行代码将在当前工作目录下先创建一个名为subdir1的目录,再在subdir1目录下创建一个名为subdir2的目录。
os模块
7
删除目录
使用os.rmdir函数可以删除指定路径的最后一层目录。
os.rmdir函数的语法格式为:
os.rmdir(path)
其中,path指定了要删除的目录。
例如:
os.rmdir(os.getcwd()+os.sep+'newdir')
程序执行完毕后,会将当前工作目录下的newdir目录删除。
os模块
8
删除多级目录
如果需要删除指定路径的最后多层目录,可以使用os.removedirs函数。
os.removedirs函数的语法格式为:
os.removedirs(path)
其中,path指定了要删除的目录。os.removedirs函数会从指定路径中的最后一个目录开始逐层向前删除,直到指定路径中的所有目录都删除完毕或者遇到一个不为空的目录。
例如:
os.removedirs(os.getcwd()+os.sep+'subdir1'+os.sep+'subdir2')
首先会删除当前工作目录的subdir1目录下的subdir2 子目录;然后删除当前工作目录下的subdir1目录;最后会因当前工作目录不是空目录而停止删除操作,os.removedirs函数执行结束。
os模块
9
相对路径、绝对路径
相对路径是指相对于当前工作目录指定的路径, 其中“.”表示当前目录,而“..”表示上一层目录;
绝对路径是指从最顶层目录开始所给出的完整的路径。
例如:
如果要访问当前工作目录下名字为DLLs的目录,既可以使用相对路径'.\\DLLs'或'DLLs',也可以使用绝对路径 'D:\\Python\\Python37\\DLLs';如果要访问当前工作目录的上一层目录,既可以使用相对路径'..',也可以使用绝对路径'D:\\Python'。
os模块
10
获取指定相对路径的绝对路径
使用os.path.abspath函数可以获取指定相对路径的绝对路径,其语法格式为:
os.path.abspath(path)
其作用是获取path所对应的绝对路径。
例如:
print(os.path.abspath('..'))
print(os.path.abspath('DLLs'))
D:\Python
D:\Python\Python37\DLLs
os模块
11
获取文件所在目录的路径
使用os.path.dirname可以获取文件所在目录的路径,其语法格式为:
os.path.dirname(path)
其作用是返回path中去除文件名后的路径。
例如:
print(os.path.dirname('D:\\Python\\Python37\\LICENSE.txt'))
D:\Python\Python37
os模块
12
获取指定路径的目录名或文件名
使用os.path.split函数可以将指定路径分解成路径名和目录/文件名两部分:
os.path.basename(path)
其作用是返回path中的文件名。
例如:
print(os.path.basename('D:\\Python\\Python37\\LICENSE.txt'))
LICENSE.txt
os模块
13
获取文件名
使用os.path.basename可以获取指定路径中的文件名,其语法格式为:
os.path.split(path)
其作用是返回一个由path分解得到的路径名和目录/文件名组成的元组。
例如:
print(os.path.split(os.getcwd()+os.sep+'LICENSE.txt'))
('D:\\Python\\Python37', 'LICENSE.txt')
os模块
14
分离文件扩展名
使用os.path.splitext函数可以将扩展名从指定路径中分离出来,其语法 格式为:
os.path.splitext(path)
其作用是将path所指定的路径分解为一个元组(root, ext),其中ext是 扩展名,root是扩展名前面的内容。
例如:
print(os.path.splitext('d:\\Python\\Python37\\LICENSE.txt'))
('D:\\Python\\Python37\\LICENSE', '.txt')
os模块
15
路径连接
使用os.path.join函数一个路径的多个组成部分用系统路径分隔符连接在一起,其语法格式为:
os.path.join(path, *paths)
其作用是将各参数用系统路径分隔符连接得到的结果返回。
例如:
print(os.path.join('D:\\Python','Python37','LICENSE.txt'))
D:\Python\Python37\LICENSE.txt
os模块
16
判断指定路径目标是否为文件
使用os.path.isfile函数可以判断指定路径目标是否为文件。 os.path.isfile函数的语法格式为:
os.path.isfile(path)
其作用是判断path所指定的目标是否是文件。 如果是文件,则返回True;否则,返回False。
例如:
dir=os.getcwd() #dir保存了当前工作目录
file=dir+os.sep+'LICENSE.txt' #file保存了当前工作目录下 LICENSE.txt #文件的路径
print(dir+'是文件:'+str(os.path.isfile(dir)))
print(file+'是文件:'+str(os.path.isfile(file)))
D:\Python\Python37是文件:False
D:\Python\Python37\LICENSE.txt是文件:True
os模块
17
判断指定路径目标是否为目录
使用os.path.isdir函数可以判断指定路径目标是否为目录,其语法格式为:
os.path.isdir(path)
其作用是判断path所指定的目标是否是目录。 如果是目录,则返回True;否则,返回False。
例如:
dir=os.getcwd() #dir保存了当前工作目录
file=dir+os.sep+'LICENSE.txt' #file保存了当前工作目录下 LICENSE.txt #文件的路径
print(dir+'是目录:'+str(os.path.isdir(dir)))
print(file+'是目录:'+str(os.path.isdir(file)))
D:\Python\Python37是目录:True
D:\Python\Python37\LICENSE.txt是目录:False
os模块
18
判断指定路径是否存在
使用os.path.exists函数可以判断指定路径是否存在,其语法格式为:
os.path.exists(path)
其作用是判断path所指定的路径是否存在。 如果存在,则返回True;否则,返回False。
例如:
path1=os.getcwd() #path1保存了当前工作目录
path2=path1+os.sep+'mytest' #path2保存了当前工作目录下mytest子目 #录的路
print(path1+'存在:'+str(os.path.exists(path1)))
print(path2+'存在:'+str(os.path.exists(path2)))
D:\Python\Python37存在:True
D:\Python\Python37\mytest存在:False
os模块
19
判断指定路径是否为绝对路径
使用os.path.isabs函数可以判断指定路径是否为绝对路径,其语法格式为:
os.path.isabs(path)
其作用是判断path所指定的路径是否为绝对路径。 如果是绝对路径,则返回True;否则,返回False。
例如:
print('..是绝对路径:'+str(os.path.isabs('..')))
print(os.getcwd()+'是绝对路径:'+str(os.path.isabs(os.getcwd())))
..是绝对路径:False
D:\Python\Python37是绝对路径:True
os模块
20
文件读写
PART 02
程序中的数据都存储在内存中,当程序执行完毕后,内存中的数据将丢失。
文件可以用来进行数据的长期保存。
使用open函数可以打开一个要做读/写操作的文件,其常用形式为::
open(filename, mode='r')
其中,filename是要打开文件的路径;mode是文件打开方式,不同文件 打开方式可以组合使用,默认打开方式为'r'(等同于'rt')。 使用open函数打开文件后会返回一个文件对象,利用该文件对象可完 成文件中数据的读写操作。
文件读写
22
文件打开方式
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
b 二进制模式。
t 文本模式 (默认)。
+ 打开一个文件进行更新(可读可写)。
文件读写
代码缩进 4个空格
正文缩进1.27厘米
23
常用文件打开方式组合
模式 描述
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
文件读写
代码缩进 4个空格
正文缩进1.27厘米
24
open函数使用示例:
f=open('D:\\Python\\test.txt', 'w+')
即以“w+”方式打开文件“D:\\Python\\test.txt”,
并将返回的文件对象赋给f,
后面可用f对该文件进行读写操作。
文件读写
25
文件关闭
使用open函数打开文件并完成读/写操作后,必须使用文件对象的close 方法将文件关闭。
例如,假设有一个文件对象f,则在对f所对应的文件完成读/写操作后, 应使用“f.close()”关闭文件。
f=open('D:\\Python\\test.txt', 'w+')
print('文件已关闭:',f.closed)
f.close()
print('文件已关闭:',f.closed)
文件已关闭:False
文件已关闭:True
文件读写
26
write方法
使用文件对象的write方法可以将字符串写入到文件中,其语法格式为:
f.write(str)
其中,f是open函数返回的文件对象,str是要写入到文件中的字符串。 f.write函数执行完毕后将返回写入到文件中的字符数。
例如
charnum=0
with open('D:\\Python\\test.txt','w+') as f:
charnum+=f.write('Python是一门流行的编程语言!
')
charnum+=f.write('我喜欢学习Python语言!')
print('总共向文件中写入的字符数:%d'%charnum)
总共向文件中写入的字符数:32
文件读写
27
read方法
使用文件对象的read方法可以从文件中读取数据,其语法格式为:
f.read(n=-1)
其中,f是open函数返回的文件对象;n指定了要读取的字节数,默认 值-1表示读取文件中的所有数据。read方法将从文件中读取的数据返回。
例如
with open('D:\\Python\\test.txt','r') as f:
content1=f.read()
content2=f.read()
print('content1:
%s'%content1)
print('content2:
%s'%content2)
文件读写
28
readline方法
使用文件对象的readline方法可以从文件中每次读取一行数据,其语法 格式为:
f.readline()
其中,f是open函数返回的文件对象。 readline方法将从文件中读取的一行数据返回。
例如
ls=[]
with open('D:\\Python\\test.txt','r') as f:
ls.append(f.readline())
ls.append(f.readline())
print(ls)
['Python是一门流行的编程语言!
','我喜欢学习Python语言!']
文件读写
29
readlines方法
使用文件对象的readlines方法可以从文件中按行读取所有数据,其语法格式为:
f.readlines()
其中,f是open函数返回的文件对象。 readlines方法将从文件中按行读取的所有数据以列表形式返回。
例如
with open('D:\\Python\\test.txt','r') as f:
ls=f.readlines()
print(ls)
['Python是一门流行的编程语言!
','我喜欢学习Python语言!']
文件读写
30
seek方法
使用seek方法可以移动文件指针,从而实现文件的随机读写,其语法格式为:
f.seek(pos, whence=0)
其中,f是open函数返回的文件对象;pos是要移动的字节数;whence 是参照位置,默认值0表示以文件首作为参照位置,1和2分别表示以当前文件指针位置和文件尾作为参照位置。seek方法没有返回值。
例如
with open('D:\\Python\\test.txt','r') as f:
f.seek(6,0)
print(f.readline())
是一门流行的编程语言!
文件读写
31
数据的处理
PART 03
一维数据
一维数据是指数据元素的值由一个因素唯一确定。
例如:
对于N名学生在语文考试中的成绩,每个成绩由学生唯一确定,学生1 的考试成绩为成绩1、学生2的考试成绩为成绩2、…、学生N的考试成 绩为成绩N。
数据的处理
33
一维数据
对于一维有序数据,可以使用列表存储;
对于一维无序数据,可以使用集合存储。
例如:
对于5名学生的语文课成绩,可以使用如下形式的列表存储:
data1D=[90,70,95,98,65]
数据的处理
34
二维数据
二维数据是指数据元素的值由两个因素共同确定。
例如:
对于M名学生在语文、数学、英语三门课程考试中的成绩,由学生和 课程共同确定,学生1在语文、数学和英语课上的考试成绩分别为成 绩11、成绩12和成绩13;……;学生M在语文、数学和英语课上的考 试成绩分别为成绩M1、成绩M2和成绩M3。
数据的处理
35
二维数据
二维数据可以看作是由多个一维数据组成。
数据的处理
36
二维数据
通过二维列表可以存储二维数据。
例如:
要使用二维列表存储5名学生在3门课程上的成绩,需要写成如下形式:
data2D=[[90,98,87], #第1名学生的3门课程成绩
[70,89,92], #第2名学生的3门课程成绩
[95,78,81], #第3名学生的3门课程成绩
[98,90,95], #第4名学生的3门课程成绩
[65,72,70]] #第5名学生的3门课程成绩
数据的处理
37
CSV文件存储示例
对于一维数据,使用CSV文件存储的结果为:
90,70,95,98,65
对于二维数据,使用CSV文件存储的结果为:
90,98,87
70,89,92
95,78,81
98,90,95
65,72,70
数据的处理
38
CSV文件的写操作
csv模块的writer方法可以生成一个writer对象,使用该对象可以将数据 以逗号分隔的形式写入到CSV文件中。csv.writer方法的语法格式为:
csv.writer(csvfile)
其中,csvfile是一个具有write方法的对象。
如果将open函数返回的文件对象作为实参传给csvfile,则调用open 函数打开文件时必须加上一个关键字参数“newline=''”。
数据的处理
39
CSV文件的写操作
生成writer对象后,就可以使用csv模块的writerow和writerows方法向CSV 文件中写入数据。csv.writerow和csv.writerows方法的语法格式分别为:
writer.writerow(row)
writer.writerows(rows)
其中,writer是csv.writer方法返回的writer对象;
row是要写入到 CSV文件中的一行数据(如一维列表);
rows是要写入到CSV文 件中的多行数据(如二维列表)。
数据的处理
40
CSV文件读写示例
1 import csv #导入csv模块
2 data2D=[[90,98,87], #第1名学生的3门课程成绩
3 [70,89,92], #第2名学生的3门课程成绩
4 [95,78,81], #第3名学生的3门课程成绩
5 [98,90,95], #第4名学生的3门课程成绩
6 [65,72,70]] #第5名学生的3门课程成绩
7 with open('D:\\Python\\score.csv','w',newline='') as f: #打开文件
8 csvwriter=csv.writer(f) #得到writer对象
9 csvwriter.writerow(['语文','数学','英语']) #先将列标题写入CSV文件
10 csvwriter.writerows(data2D) #将二维列表中的数据写入CSV文件
11 ls2=[]
12 with open('D:\\Python\\score.csv','r',newline='') as f: #打开文件
13 csvreader=csv.reader(f) #得到reader对象
14 for line in csvreader: #将CSV文件中的一行数据作为列表读取到line中
15 ls2.append(line) #将当前行数据的列表添加到ls2的尾部
16 print(ls2) #输出ls2
[['语文', '数学', '英语'],
['90', '98', '87'],
['70', '89', '92'],
['95', '78', '81'],
['98', '90', '95'],
['65', '72', '70']]
数据的处理
41
谢谢观看
$$