|
楼主 |
发表于 2024-4-6 22:34
|
显示全部楼层
本帖最后由 bala 于 2024-4-7 16:55 编辑
第六章 数据处理
1.文件处理
(1)文件打开与关闭
Python内置了open()方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出“OSError”。使用open()方法一定要保证关闭文件,即调用 close() 方法。
- open(file, mode='r', encoding=None, buffering=-1,errors=None, newline=None, closefd=True)
复制代码
file: 必需,文件路径(相对或者绝对路径)
mode: 可选,文件打开模式。默认采用text-mode读取文件,对于二进制文件,需要加入’b’,例如’br’
buffering: 设置缓冲
encoding: 一般使用 utf-8
errors: 报错级别
newline: 区分换行符
closefd: 传入的 file 参数类型
其中,mode模式有:r只读 w只写,w+读写且写入时覆盖原文件,a追加写入。详细请看菜鸟教程内置函数open()一栏https://www.runoob.com/python/python-func-open.html
关于文件路径问题,python的路径有点让人头大,我们习惯写全路径,而且路径内习惯性的将“\”替换为“/”,因为“\”一般用来转义的,详见https://www.runoob.com/python3/python3-string.html,有时候前面加了r,在读取shp文件时还是会报错,所以我们建议路径内尽量使用“/”
(2)文件读取
上面链接内包含了文件读取的教程
下面是一个文件读取的示例:
- f = open('D:/data/content.txt','r')#以只读模式打开文件
- con=f.read() #读入所有内容,作为一个字符串
- con=f.readline() #读入一行
- con=f.readlines() #读入所有内容,作为一个列表
- x = [c.replace('\n','') for c in con] #替换读入列表中的换行符,replace函数可参考[url=https://www.runoob.com/python/att-string-replace.html]https://www.runoob.com/python/att-string-replace.html[/url]
- f.close()
复制代码
(3)文件写入
f.write(str):将字符串写入文件,返回的是写入的字符长度。
f.writelines(sequence):向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符('\n')。
例如:
- with open('table.txt','w+') as f: #打开table.txt文件,如果没有就创建了
- for x in range(1, 11): #创建一个1到10的列表
- f.writelines([repr(x).rjust(3), repr(x*x).rjust(4),repr(x*x*x).rjust(5), '\n']) #repr()和rjust()函数参考菜鸟教程
复制代码
(4)目录查询
我们建议将气象数据归集到一个文件夹内,且分级、分类明确,以便于我们查找。
对目录或者目录下的文件属性可以进行查询,使用到的是 os 库。
- import os
- curPath=os.getcwd() #获取当前工作路径
- a = os.listdir() #列举
- b = os.stat(r'E:/PythonTTTTTTest/code.txt') #获取文件属性
- c = os.path.getsize(r'E:/PythonTTTTTTest/code.txt') #获取文件大小
- d = os.path.exists(r'E:/PythonTTTTTTest/') #路径是否存在
- e = dirs,fileName=os.path.split(r'E:/PythonTTTTTTest/code.txt') #分割路径和文件名
- f = os.path.splitext(r'E:/PythonTTTTTTest/code.txt') #分离扩展名
- print(a,b,c,d,e,f)
复制代码
结果:
a输出的结果['02cfcdd006db46d28e57afd717b69469.xlsx', '1.jpg', '11111.txt', '11111.xlsx', '114.png', '2022shp', '2023030700-56187.csv', '2023数据', 'skewt.py', 'allwdt.png', 'bala', 'bala.py', 'chengduradar.py', 'cmacode.csv', 'cma日值.py', 'code.txt', 'code2.txt', 'cs.py', 'data.csv', 'data1.csv', 'day1.json', 'ddns资料', 'earthq.py', 'ECMWF.py', 'getStaidAllData.json', 'GFS', 'gocqhttp', 'group.json', 'guangdong.png', 'guangdong.py'] 我们看到是一个列表的形式
b输出的结果os.stat_result(st_mode=33206, st_ino=1688849860267275, st_dev=397963, st_nlink=1, st_uid=0, st_gid=0, st_size=4009, st_atime=1712415721, st_mtime=1681382328, st_ctime=1681382231)
c输出的结果4009
d输出的结果True
e输出的结果('E:/PythonTTTTTTest', 'code.txt')
f输出的结果('E:/PythonTTTTTTest/code', '.txt')
(5)创建与删除
同样的使用os库来进行创建于删除
- os.makedirs('123') #创建文件夹
- os.remove('abc.txt') #删除文件
- os.removedirs('123') #删除目录
复制代码
当我们批量输出数据时,我们可以判断目录是否存在的情况 os.path.exists(path),不存在就创建,存在则返回 False。
- import os
- def mkdir(path):
- path=path.strip()
- path=path.rstrip("\")
- isExists=os.path.exists(path)
- if not isExists:
- os.makedirs(path)
- print( path+' 创建成功')
- return True
- else:
- print (path+' 目录已存在')
- return False
- mkdir('Folder')
复制代码
(6)遍历
当我们有比较多的到处爬来的乱七八糟的气象数据时,我们可以使用os的遍历功能(比如os.listdir())获取某个目录下的所有文件。
例1:遍历文件夹获取 CSV 数据文件列表
- import os
- path = r'E:/PythonTTTTTTest' #指定文件所在路径
- filetype ='.csv' #指定文件类型
- name =[]
- for root,dirs,files in os.walk(path):
- for i in files:
- if filetype in i:
- name.append(i.replace(filetype,''))#生成不带'.csv'后缀的文件名组成的列表
- files = [path+'\\'+item +'.csv' for item in name]#生成'.csv'后缀的文件名组成的列表
复制代码
粒2:使用glob库,以时间为通配符匹配筛选得到某一天的数据文件列表
- import glob
- pat='E:/PythonTTTTTTest/GFS/*20240320????.000'
- files=[]
- for file in glob.glob(pat):
- files.append(file)
复制代码 |
|