c++ \\ Python读文件 + 写入任意文件

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--;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值