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)#将每一个分类分别写入不同的文件
c++处理文件数据,可以写入任何文件
完整代码,但是在处理时间上,明显比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--;
}
}