想法源于网络
python 读文件夹下面所有csv格式文件,也可以读txt文件
python 3.7.6 anaconda jupyter notebook
数据
数据内容 略
分隔符是不等长度的空格
代码
import pandas as pd
import os
def read_csv(filepath ,sep=',',encoding='ANSI',header=0):
#filepath文件路径'C:\\Users\\Dell\\Desktop\\cal\\cml\\1\\'
#sep分隔符 默认','
#encoding编码 默认'ANSI'
p=[]#返回列表,里面每一个都装着dataframe
a=[]#装路径
#获取路径文件夹下面的文件的全部路径
for file in os.listdir(filepath):
a.append(os.path.join(filepath, file))
#将文件夹下的文件导入成dataframe,再装入列表p,
#即p[0]是dataframe,一个csv文件的内容
for i in range(len(a)):
p1=[]
path=a[i]
p1= pd.read_csv(path,sep=sep,encoding=encoding,header=header)
p.append(p1)
return p
path=r'C:\Users\Dell\Desktop\cal\cml\3\xinan\xinan'
p=read_csv(path,sep='\s+',encoding='ANSI',header=None)
c=pd.concat(p)#将p里面全部dataframe合成一个
结果
导出成csv格式文件
path3=r'C:\Users\Dell\Desktop\cal\cml\3\1\1.csv'
c.to_csv(path3,sep=',')
如果输入的路径是乱序的,可参照如下代码:
import re
list1 = [
'F:\\cml\\数据处理\\数据处理\\test\\1998test\\CLDAS_prcp_cut_1998010103.nc',
'F:\\cml\\数据处理\\数据处理\\test\\1998test\\CLDAS_prcp_cut_1998010101.nc',
'F:\\cml\\数据处理\\数据处理\\test\\1998test\\CLDAS_prcp_cut_1998010102.nc',]
new = sorted(list1,key = lambda i:int(re.search(r'(\d{10})',i).group()))
#根据需要替换 r'(\d{10})'
print(new)
正则表达式寻找顺序规律
结果
实在不会使用正则时,需要选定某个范围文件路径
#例
a1=['CLDAS_prcp_cut_1998010101.nc','CLDAS_prcp_cut_1998031602.nc',
'CLDAS_prcp_cut_1999043021.nc','CLDAS_prcp_cut_1999062719.nc',
'CLDAS_prcp_cut_2000032701.nc','CLDAS_prcp_cut_2000030505.nc']
#筛选条件
y=['1998','1999','2000']
m=['02','03','04']
d=['05','16','27','30']
h=['02','19','21']
#装路径
path=[]
for a in a1:
# if a[15:19] in y and a[19:21] in m and a[21:23] in d and a[23:25] in h:
if a[15:19] in y :#字符串年份的位置
if a[19:21] in m :
if a[21:23] in d :
if a[23:25] in h:
path.append(a)
else:
print('h:',a[23:25])
else:
print('d:',a[21:23])
else:
print('m:',a[19:21])
else:
print('y:',a[15:19])
path
结果
可能能用
p1[p1['number'].isin([i[0] for i in p.values])]
# isin(xxx),xxx是要选的列表,在number列里面满足要求的数据
# dataframe里面通过列表选择想要的数据
# p1是多的那个dataframe,p是想选的那个dataframe,只有一列的
p1[p1['所选列'].isin(['想要的数据列表'])]