第七章 文件-2
7.4 文件和目录操作
文件和目录操作包括:查看文件属性、复制和删除文件、创建和删除目录等
1.os 模块
2.os.path 模块
3.shutil 模块
1 os 模块
os模块(库):
- Python内置的os模块提供了访问操作系统服务功能,如文件重命名,文件删除,目录创建,目录删除等
- 使用时需先导入该模块
import os
方法名 | 含义 |
---|---|
os.getcwd() | 显示当前的工作目录(路径) |
os.chdir(newdir) | 改变当前工作目录,如os.chid |
os.listdir(path) | 列出指定目录下所有的文件和目录 |
os.mkdir(path) | 创建单级目录 |
os.makedirs(path) | 创建多级目录 |
os.rmdir(path) | 删除单级目录 |
os.removedirs(path) | 删除多级目录 |
os.rename(old,new) | 将文件或目录old重命名为new |
os.remove(path) | 删除文件 |
【课堂实践】准备:在D盘新建一个文件夹“python123”,在该文件夹下新建一个文本文件“a1.txt”,然后在IDLE下完成如下操作
>>> import os
>>> os.getcwd()#python安装目录不同,返回的结果可能不同
'D:\\Python35'
>>> os.chdir("d:/python123")
>>> os.getcwd()
'd:\\python123'
>>> os.listdir("d:/python123")
['a1.txt']
>>> os.mkdir("d:/python123/abc")
>>> os.makedirs("d:/python123/a/b/c")
>>> os.removedirs("d:/python123/a/b/c")
>>> os.rename("a1.txt","b1.txt")
>>> os.remove("d:/python123/b1.txt")
2 os.path 模块
os.path模块(库):
- Python内置的os.path模块主要用于针对路径的操作
- 使用时需先导入该模块
import os.path
方法名 | 含义 |
---|---|
os.path.split(path) | 分割路径与文件名,返回元组(<路径>,<文件名>) |
os.path.splitext(path) | 分割文件名与扩展名,返回元组(<文件名>,<扩展名>) |
os.path.abspath(path) | 获得文件的绝对路径 |
os.path.dirname(path) | 去掉文件名,只返回目录路径 |
os.path.getsize(file) | 获得指定文件的大小,返回值以字节为单位 |
os.path.basename(path) | 去掉目录路径,只返回路径中的文件名 |
os.path.exists(path) | 判断文件或目录是否存在 |
【课堂实践】准备:在D盘新建一个文件夹“python123”,在该文件夹下新建一个文本文件“a1.txt”,然后在IDLE下完成如下操作
import os.path
>>> os.path.split("d:/python123/a1.txt")
('d:/python123', 'a1.txt')
>>> os.path.splitext("d:/python123/a1.txt")
('d:/python123/a1', '.txt')
>>> os.chdir("d:/python123")
>>> os.path.abspath("a1.txt")
'd:\\python123\\a1.txt'
>>> os.path.dirname("d:/python123/a1.txt")
'd:/python123'
>>> os.path.basename("d:/python123/a1.txt")
'a1.txt'
>>> os.path.exists("d:/python123/a1.txt")
True
综合实例
【例7-3】把“d:\pyton123”路径下的所有.jpg图片文件名称加上“_Python”,如将“a1.jpg”修改文件名为“a1_Python.jpg”。(准备:在d:\python123目录下存储4张图片,图片的名字为*.jpg)
#E7-3.py
import os
imgDir="d:/python123"
for filename in os.listdir(imgDir): #将该目录下所有文件返回一个列表,遍历该列表
lists=filename.split('.')#将文件名分割成包含主文件名和扩展名的列表lists
if lists[-1]=="jpg":#取扩展名,判断是否为jpg
oldFile=imgDir+'/'+filename #原文件的绝对路径
newFile=imgDir+'/'+lists[0]+'_Python'+'.'+fileExt #重命名后文件的绝对路径
os.rename(oldFile,newFile) #重命名操作
7.5 CSV文件格式读/写操作
- 数据包括文件存储和程序使用两个状态。
- 存储不同维度的数据需要适合维度特点的文件存储格式,处理不同维度数据的程序需要使用相适应的数据类型或结构
- 因此,对于数据处理,需要考虑存储格式以及表示和读写等两个问题
数据维度
- 一组数据在被计算机处理前需要进行一定的组织,表明数据之间的基本关系和逻辑,进而形成数据的维度
- 根据数据的关系不同,数据组织可以分为:一维数据、二维数据和高维数据
一维数据
- 一维数据,由对等关系的有序或无序数据组成,采用线性方式组织,对应于数学中的数组和集合等概念
- 例如:国际经济合作论坛20国集团(G20) 成员是对等关系,表示为一维数据,无论采用何种方式分隔和表示,一维数据都具有线性特点
中国,美国,日本,德国,法国,英国,意大利,加拿大,俄罗斯 ,欧盟,澳大利亚,南非, 阿根廷,巴西,印度尼西亚,墨西哥,沙特阿拉伯,土耳其,韩国
二维数据
- 二维数据,也称表格数据,由关联关系数据组成,采用表格方式组织,对应于数学中的矩阵
- 例如:国家统计局发布的近5年我国粮食产量是二维数据,摘录部分如表格如示
指标 | 2019年 | 2018年 | 2017年 | 2016年 | 2015年 |
---|---|---|---|---|---|
粮食产量(万吨) | 66384.00 | 65789.22 | 66160.72 | 66043.51 | 66060.27 |
夏收粮食产量(万吨) | 14160.00 | 13881.02 | 14174.46 | 14050.16 | 14074.94 |
秋粮产量(万吨) | 49597.00 | 49049.18 | 48999.10 | 48890.78 | 48778.09 |
谷物产量(万吨) | 61368.00 | 61003.58 | 61520.54 | 61666.53 | 61818.41 |
稻谷产量(万吨) | 20961.00 | 21212.90 | 21267.59 | 21109.42 | 21214.19 |
玉米产量(万吨) | 26077.00 | 25717.39 | 25907.07 | 26361.31 | 26499.22 |
高维数据
- 高维数据,由键值对类型的数据构成,采用对象组织,可以多层嵌套,属于整合度更好的数据组织方式,能表达更加灵活和复杂的数据关系
- 高维数据在Web系统中十分常用,作为当今Internet组织内容的主要方式,高维数据衍生出HTML、XML、JSON等具体数据组织的语法结构
- 例如,描述中国古典四大名著的JSON格式的高维数据表示,
"四大名著":[
{"书名": "红楼梦", "作者": "曹雪芹"},
{"书名": "三国演义", "作者": "罗贯中"},
{"书名": "水浒传", "作者": "施耐庵"},
{"书名": "西游记", "作者": "吴承恩"}
]
CSV格式
- CSV是国际通用的一、二维数据存储格式,采用逗号分隔数值的存储格式,在商业上和科学上广泛应用,尤其应用在程序之间转移表格数据
- CSV的应用有如下一些规则:
- 纯文本格式,通过单一编码表示字符
- 以行为单位,开头不留空行,行之间没有空行
- 每行表示一个一维数据,多行表示二维数据
- 以逗号(英文、半角)分隔每列数据,列数据为空也要保留逗号
- 对于表格数据,可以包含或不包含列名,包含时列名放置在文件第一行
数据摘录于2020年3月国家统计局发布的能源产品产量
nycpcl.csv - 记事本
指标,本月,当月增速(%),累计增速(%)
原煤(万吨),33726.00,9.60,-0.50
天然气(亿立方米),168.60,11.20,9.10
原油(万吨),1656.30,-0.10,2.40
汽油(万吨),943.00,-21.00,-16.30
发电量(亿千瓦时),5525.10,-4.60,-6.80
CSV格式
- CSV格式的每一行是一维数据,可以使用Python中的列表类型表示,整个CSV文件是一个二维数据,由表示每一行的列表类型作为元素,组成一个二维列表
【例7-4】 导入CSV格式数据到列表
#E7-4.py
fo=open("d:/python/nycpcl.csv","r")
ls=[]
for line in fo:
ls.append(line.split(","))
print(ls)
fo.close()
程序运行结果
[['指标', '本月', '当月增速(%)', '累计增速(%)\n'], ['原煤(万吨)', '33726.00', '9.60', '-0.50\n'], ['天然气(亿立方米)', '168.60', '11.20', '9.10\n'], ['原油(万吨)', '1656.30', '-0.10', '2.40\n'], ['汽油(万吨)', '943.00', '-21.00', '-16.30\n'], ['发电量(亿千瓦时)', '5525.10', '-4.60', '-6.80\n']]
【例7-4】 导入CSV格式数据到列表
一次读入全部数据写入
#E7-4.py
fo=open("d:/python/nycpcl.csv","r")
ls=[]
for line in fo:
#line=line.replace("\n","")
line=line.strip("\n")
ls.append(line.split(","))
print(ls)
fo.close()
程序运行结果
[['指标', '本月', '当月增速(%)', '累计增速(%)'], ['原煤(万吨)', '33726.00', '9.60', '-0.50'], ['天然气(亿立方米)', '168.60', '11.20', '9.10'], ['原油(万吨)', '1656.30', '-0.10', '2.40'], ['汽油(万吨)', '943.00', '-21.00', '-16.30'], ['发电量(亿千瓦时)', '5525.10', '-4.60', '-6.80']]
【例7-5】 逐行处理CSV格式数据
#E7-5.py
fo=open("d:/python/nycpcl.csv","r")
for line in fo:
#line=line.replace("\n","")
line=line.strip("\n")
ls=line.split(",")
lns=""
for s in ls:
lns+="{:<15}".format(s)
print(lns)
fo.close()
程序运行结果
指标 本月 当月增速(%) 累计增速(%)
原煤(万吨) 33726.00 9.60 -0.50
天然气(亿立方米) 168.60 11.20 9.10
原油(万吨) 1656.30 -0.10 2.40
汽油(万吨) 943.00 -21.00 -16.30
发电量(亿千瓦时) 5525.10 -4.60 -6.80
【例7-6】 一维数据写入CSV格式文件
#E7-6.py
fo=open("d:/python/nycpcl.csv","a+")
ls=["煤气(亿立方米)","1217.30","1.60","4.00"]
fo.write(",".join(ls)+"\n")
fo.close()
程序运行结果
nycpcl.csv - 记事本
指标,本月,当月增速(%),累计增速(%)
原煤(万吨),33726.00,9.60,-0.50
天然气(亿立方米),168.60,11.20,9.10
原油(万吨),1656.30,-0.10,2.40
汽油(万吨),943.00,-21.00,-16.30
发电量(亿千瓦时),5525.10,-4.60,-6.80
煤气(亿立方米),1217.30,1.60,4.00
【例7-7】 二维数据写入CSV格式文件操作,将nycpcl.csv文件的前三行读出来写入到a1.csv文件中
#E7-7.py
fo=open("d:/python/nycpcl.csv","r")
fw=open("d:/python/a1.csv","w")
ls=[]
i=0
for line in fo:
ls.append(line.split(","))
i+=1
if i==3:
break
for row in ls:
fw.write(",".join(row))
fo.close()
fw.close()
程序运行结果
al.csv - 记事本
指标,本月,当月增速(%),累计增速(%)
原煤(万吨),33726.00,9.60,-0.50
天然气(亿立方米),168.60,11.20,9.10