1、先来个简单的,dataframe可以轻松完成csv文件的读写 下面的例子是进行数据的归一化,公式为:(x - min) / (max - min)
# coding:utf-8 import glob import csv import pandas as pd import os df = pd.read_csv('aaa.csv') maxx = dict(df.max()) minn = dict(df.min()) name = list(df.columns) # 提前创建个dataframe dff = pd.DataFrame(columns=name) for i in range(len(name)): dff[name[i]] = df[name[i]].apply(lambda x:round((x-minn[name[i]])/(maxx[name[i]] - minn[name[i]]),3))# 完成归一化 # print dff dff.to_csv('aa.csv',index=False)2、对任意文件的读写 任务:根据给出的数据进行高斯分布聚类,并生成分类文件夹(类内文件中只有属于该分类的数据行) 读取的是.box文件,然后生成的也是.box文件,对我来说,难点在于文件的读写。。。 1.提取全部数据 2.高斯分布,参数计算 + 分类(spss完成) 3.聚类生成csv文件 4.按照csv文件进行数据重新写入/.box文件
import glob import csv import os #csvFile = open('文件名','r-读,w-写,a-追加',指定缓冲) csvFile2 = open('out_test4.1.csv','r',newline='') num = 0 with csvFile as f: for line in f.readlines(): #print(line) #print('---------------------',num) #这个csv文件的结构是name(字符),剩下的6个字段为int数字 name = line.split(',')[0]#读的是csv文件,以,分隔开每行数据 x, y, h, w, pix, clas = [int(i) for i in line.split(',')[1:7]]#读入的是int,从1开始读到7结束,其实读的是1,2,3,4,5,6 num += 1#计数器,检验数据是否读完 if(clas != 4 and clas != 8): path = str('./box_clas_'+str(clas))#指定 print(path,'---------name-----------') folder = os.path.exists(path) if not folder:#判断是否存在文件夹如果不存在则创建为文件夹 os.makedirs(path)#makedirs 创建文件时如果路径不存在会创建这个路径 print("---OK---") boxFile = open(path+'/'+name,'a',newline='')#如果没这个文件,会自动创建文件 #一次只能写入一行,所以一次就写一个字段 boxFile.write(str(x))#x坐标 boxFile.write('\t') boxFile.write(str(y))#y坐标 boxFile.write('\t') boxFile.write(str(h)) #高 boxFile.write('\t') boxFile.write(str(w))#宽 boxFile.write('\t') boxFile.write(str(pix))#像素 boxFile.write('\n') boxFile.close()还有一个写入文件很强大的工具pandas,但目前还没找到写入任意文件的方式,在此做一个记录
import pandas as pd from pandas import DataFrame csvFile = pd.read_csv('G:/Test/5-18/box_cl/out_test4.1.csv')#读取文件 df = pd.DataFrame(csvFile)#存入dataframe中 for i in range(1,8): if i != 4: #一下筛选了好多行,怎么将这些行分别写入不同的文件 dt = df.ix[df['class'] == i,0:7]#筛选的是class列中等于i的,0-7指的是一整行0-7个数据 path = str('out_class_'+str(i)+'.csv') dt.to_csv(path,sep=',',header=False,index = False)#将每一个分类分别写入不同的文件完整代码,但是在处理时间上,明显比python要慢
#include <iostream> #include <cstdio> #include <cmath> #include <fstream> #include <cstring> #include <streambuf> #include <sstream> #include <algorithm> #include <cstdlib> #include <io.h> using namespace std; #define N 4010 struct PIX { string name; int data; int x,y,h,w; int id; int fid; int Class; int file_id; bool operator < (const PIX &a) const { if(a.name == name) return a.data < data; } } box[N],bo[N]; void Read_class() { char buffer1[120]; ifstream in1("G:/Test/5-18/box_cl/data_class.txt"); if (!in1.is_open()){ cout << "Error opening file"; } int num = 0; while(!in1.eof()) { in1.getline (buffer1,100); stringstream stream(buffer1); int int_tem; stream>>int_tem; box[num].Class = int_tem; num++; } cout<<num<<endl; } void Read_data() { char buffer2[120],buffer3[120]; ifstream in2("G:/Test/5-18/box_cl/data_name.txt"); ifstream in3("G:/Test/5-18/box_cl/data.txt"); if (!in2.is_open() || !in3.is_open()){ cout << "Error opening file"; } int num = 0; while(!in2.eof() && !in3.eof()) { in3.getline (buffer3,100); stringstream stream(buffer3); int int_tem; stream>>int_tem; box[num].data = int_tem; in2.getline (buffer2,100); stream>>buffer2; box[num].name = buffer2; num++; } cout<<num<<endl; } string Name[N]; void read_name() { char buffer2[120]; ifstream in2("G:/Test/5-18/box_cl/name.txt"); if (!in2.is_open()){ cout << "Error opening file"; } int num = 0; while(!in2.eof()) { in2.getline (buffer2,100); stringstream stream(buffer2); Name[num] = buffer2; num++; } cout<<num<<endl; } string s[10][100]; void file_path(int file_num){ string t = "G:\\Test\\5-18\\box_cl\\box_class_";///文件名需要 右斜杠 for(int i = 1;i < 8;i++){///生成文件路径 if(i != 4){ for(int j = 0;j < file_num;j++){ stringstream stream; stream<<i; string path = t+stream.str(); if (access(path.c_str(), 0) == -1){///目录不存在,则创建 int flag=mkdir(path.c_str()); if (flag == 0){ cout<<"make successfully"<<endl; } else{ cout<<"make errorly"<<endl; } } s[i][j] = path + "\\"+Name[j]; } } } } void Write_toBox(PIX A,int CLASS,int j){ ofstream oFile;///定义文件输出流 ///文件路径需要转成char* oFile.open(s[CLASS][j].c_str(), ios::out | ios::app); oFile<<A.x<<"\t"<<A.y<<"\t"<<A.h<<"\t"<<A.w<<"\t"<<A.data<<"\n"; oFile.close(); } int main () { read_name(); Read_data(); Read_class(); int file_num = 86; file_path(file_num); int CLASS = 7; int n = 3583; while(CLASS>0){ if(CLASS != 4){ for(int j = 0;j < file_num;j++){ for(int i = 0;i < n;i++){ if(box[i].Class == CLASS && box[i].name == Name[j]){ Write_toBox(box[i],CLASS,j); } } } } CLASS--; } }