|  | 
 
 楼主|
发表于 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)
 | 
 |