写在前面:利用python对excel或者csv文件进行预处理,可以避免手工重复操作,节省时间开销并提高工作效率。本文将总结项目中常用的文件处理操作,需用到的python模块有:os、pandas、openpyxl。
大家可以关注我们的公众号,一起学习Python小技巧
Python学习交流群:773162165
大家可以加群一起学习,有啥不懂的可以在群里问大佬哟!
1、获取文件夹下所有文件
方法一:读取文件夹下所有文件名(不读取子文件夹下文件名,顺序为乱序)
#采用os.listdir()函数
def listdir(path): #path为文件夹的存储路径
list_name=[] #保存所有文件名至列表
list_dir = os.listdir(path)
# list_dir.sort(key=lambda x:int(x[:-5])) #若文件名无中文,可对列表进行排序
for file in list_dir: #由于子文件名后缀为.xlsx,因此为-5
file_path = os.path.join(path, file)
list_name.append(file_path)
return list_name
方法二:读取文件夹下指定后缀文件名(包括子文件下文件名,顺序为乱序)
#采用os.walk()方法,读取文件夹中后缀为.csv的文件名
def listdir2(path): #path为文件夹的存储路径
type = ('.csv') #可在此处更改文件类型
list_name = [] #保存所有文件名至列表
for root, dirs, files in os.walk(path):
for f in files:
fname = os.path.join(root, f)
if fname.endswith(type):
list_name.append(fname)
return list_name
2、读取多个excel内容存到list中
#函数的输入为列表,存储着多张excel的文件位置
#函数的输出为二维列表,保存着多张excel的内容
def textList(list_name): #list_name为多张表的位置信息列表
text_excel = [] #text_excel为存储多张表的二维列表
for num in list_name:
excel = pd.read_excel(num, header=None, skiprows=0)
excel = excel.values.tolist()
text_excel.extend(excel)
return text_excel
3、将二维列表的值写入excel中
#利用openpyxl模块实现,还有一种常用的是利用pandas模块,后续进行介绍
def writeToExcel(file_path, new_list): #file_path为excel存储路径,new_list为二维列表
wb = openpyxl.Workbook()
ws = wb.active
ws.title = 'feature'
for r in range(len(new_list)):
for c in range(len(new_list[0])):
ws.cell(r + 1, c + 1).value = new_list[r][c]
# excel中的行和列是从1开始计数的,所以需要+1
wb.save(file_path) # 注意,写入后一定要保存
print("成功写入文件: " + file_path + " !")
return 1
4、批量更改excel文件名
#批量修改文件中excel文件名,使用到1中listdir()函数
def rename_excel(path, text): #path为存储文件夹,text为替换的新内容
list_name = listdir(path)
for excel_name in list_name:
new_name = excel_name[:-10] + text + excel_name[-8:]
os.rename(excel_name, new_name)
return list_name
rename_excel(r'D:\test', '27')
执行效果,文件夹中excel命名如下:
批量将“26”改为“27”,程序执行结果为:
5、给csv添加第一列,第一列的值为日期
#给csv添加一列,该列表示时间,全部设为2021-04-26
data = pd.read_csv(r'test.csv',sep=',', header=None,skiprows=1,encoding="gbk")
col_name = data.columns.tolist() #读取列名,并放入list中
col_name.insert(0,'DATE') #给list中插入第一列
new_data = data.reindex(columns=col_name) #列名重命名
new_data['DATE']='2021-04-26' #给第一列赋值
new_data.to_csv('new_test.csv',index=0) #写入新的csv文件
6、批量修改csv中的值,并写入新的csv中
#读取csv的值,第一列为时间类型,大小不变,对其余列生成随机数字
data = pd.read_csv(path, sep=',',header=None, skiprows=1, encoding="gbk") #原始数据
col_name = list(data) #返回列名
new_col = col_name[1:] #取除第一列之外其余列的名称
col = data.shape[1] #返回列数
index = data.shape[0] #返回行数
#给其余列随机生成[0-100]之间的数字
new_data_randam = pd.DataFrame(np.random.randint(0,100,size=(index, col-1)), columns = new_col)
new_col_name = new_data_randam.columns.tolist() #生成新的列名
new_col_name.insert(0, 'DATE') #插入日期为第一列
new_test_data = new_data_randam.reindex(columns=new_col_name) #列名重命名
new_test_data['DATE'] = '2021-04-26' #给第一列进行赋值
7、csv每隔10行取1行,并写入新的csv中
#读取csv的内容,每10条进行抽样,path为csv文件位置,new_path为新的存储位置
data = pd.read_csv(path, sep=',', header=None, skiprows=1, encoding="gbk")
sample = [] #存储抽样的行数
for i in range(0, len(data), 10): #每隔10行取数据
sample.append(i)
new_data = data.iloc[sample] #根据行数对数据进行抽样
new_data = pd.DataFrame(new_data)
new_data.to_csv(new_path, index=0, header=0) # 写入新的csv文件
8、csv按列求均值、最大值、最小值,并写入新的csv中
#利用dataframe的.mean().max().min()函数分别求各列的均值、最大值和最小值
#path为csv的存储路径,new_path_mean为均值存储路径,new_path_max为最大值存储路径,new_path_min为最小值存储路径
data = pd.read_csv(path, sep=',', header=None, skiprows=1, encoding="gbk")
data_mean = data.mean(axis=0)) #均值,axis=1时,为对行求均值
data_max = data.max(axis=0)) #最大值
data_min = data.min(axis=0))) #最小值
# 均值写入新的csv文件
data_mean.to_csv(new_path_mean, index=0, header=0, mode='a') # mode='a'为追加模式
# 最大值写入新的csv文件
data_max.to_csv(new_path_max, index=0, header=0, mode='a') #mode='w'为写模式
# 最小值写入新的csv文件
data_min.to_csv(new_path_min, index=0, header=0, mode='a')