CSV文件的使用-写入/写出(C++/Python)

来源:互联网 发布:数控车床简单的编程 编辑:程序博客网 时间:2024/04/29 14:40

参考:

http://baike.baidu.com/link?url=dFr4aesUK_f_SoTqTL4jQ8DwXAQkxRC5iB3Qkj_nw13j6Nai0HcWzciRmXlUCT5ii_yiWQ3bWlalg8i1mHnO0XLWTesNEkMwSmtpPMRDyUO


#########################################################################


CSV-逗号分隔符(Comma-Separatored Values,有时也可用字符分隔符,分隔字符不一定要使用逗号)

典型分隔符是逗号,分号或制表符


excel表格可以打开csv文件,如果分隔符使用的是逗号的话,表格可以按逗号分隔,但如果不是逗号的话,并不能分隔

新建一个文件test.csv(利用逗号分隔):

hello,worldhai,hi

利用excel表格打开



新建另一个文件test2.csv(利用分号分隔):

hello;worldhai;hi

利用excel表格打开:


并没有按分号分隔


所以如果我们想要读取表格数据时,可以先将表格保存为csv文件,然后利用分隔符','读取表格数据


有时我们想要在数据中使用分隔符这时可以用双引号:

test3.csv:

"adsf,asdfa",323gadfasf,23



test4.csv:

"asdf'asdf',adf",32"ads'asd',af",45



#########################################################33


C++实现


写入CSV文件:

#include <iostream>#include <fstream>#include <sstream>#include <string>#include <vector>#include <io.h>#include <time.h>#include <direct.h>#include <algorithm>using namespace std;//图片地址const char *address="D:\\VSProject\\CSVTest\\CSVTest\\images\\";//csv存储地址const char *csv_addr="D:\\VSProject\\CSVTest\\CSVTest\\images.csv";/** * @function: 获取cate_dir目录下的所有文件名 * @param: cate_dir - const char指针类型 * @result:vector<string>类型*/vector<string> getFiles(const char *cate_dir){vector<string> files;//存放文件名#ifdef WIN32_finddata_t file;long lf;//输入文件夹路径if ((lf=_findfirst(cate_dir, &file)) == -1) {cout<<cate_dir<<" not found!!!"<<endl;} else {while(_findnext(lf, &file) == 0) {//输出文件名//cout<<file.name<<endl;if (strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0)continue;files.push_back(file.name);}}_findclose(lf);#endif#ifdef linuxDIR *dir;struct dirent *ptr;char base[1000]; if ((dir=opendir(cate_dir)) == NULL)    {perror("Open dir error...");        exit(1);    } while ((ptr=readdir(dir)) != NULL){if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0)    ///current dir OR parrent dir        continue;else if(ptr->d_type == 8)    ///file//printf("d_name:%s/%s\n",basePath,ptr->d_name);files.push_back(ptr->d_name);else if(ptr->d_type == 10)    ///link file//printf("d_name:%s/%s\n",basePath,ptr->d_name);continue;else if(ptr->d_type == 4)    ///dir{files.push_back(ptr->d_name);/*        memset(base,'\0',sizeof(base));        strcpy(base,basePath);        strcat(base,"/");        strcat(base,ptr->d_nSame);        readFileList(base);*/}}closedir(dir);#endif//排序,按从小到大排序sort(files.begin(), files.end());return files;}/** * @function: 将图片信息以及对应ID写入文件,保存为csv格式 * @param: images - const vector<string>类型,图片地址 * @param: labels - const vector<int>类型,图片ID * @param: addr - const char指针类型,存储地址 * @param: separator - char类型,分隔符,默认值为';'*/bool write_csv(const vector<string> images, const vector<int> labels, const char *addr, char separator=';'){ofstream fout(addr);if (!fout.is_open()){cout<<addr<<" could not open "<<endl;return false;}for (int i=0; i<(int)images.size(); i++){fout<<images[i];fout<<separator;fout<<labels[i]<<endl;}fout.close();return true;}int main(){//获取所有类别地址string image_address=(string)address+"*";vector<string> cates=getFiles(image_address.c_str());//图片地址vector<string> images;//图片IDvector<int> labels;for (int i=0; i<(int)cates.size(); i++){//获取类别绝对地址string cate_dir=(string)address+cates[i];//获取图片string cate_addr=cate_dir+"\\*";vector<string> imgs=getFiles(cate_addr.c_str());//判断图片是否存在if ((int)imgs.size() == 0){cout<<cate_dir<<" can not find any images"<<endl;exit(1);}//设置绝对地址for (int j=0; j<(int)imgs.size(); j++){string img_dir=cate_dir+"\\"+imgs[j];images.push_back(img_dir);labels.push_back(i+1);}}time_t start=clock();//制作csv文件write_csv(images, labels, csv_addr);time_t end=clock();double time=(double)(end-start)/CLOCKS_PER_SEC; //计算函数使用时间,以秒计cout<<"write_csv() need time is "<<time<<" s."<<endl;cout<<"end..."<<endl;cin.get();return 0;}

读出CSV文件:

static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {    std::ifstream file(filename.c_str(), ifstream::in);    if (!file) {        string error_message = "No valid input file was given, please check the given filename.";        CV_Error(CV_StsBadArg, error_message);    }    string line, path, classlabel;    while (getline(file, line)) {        stringstream liness(line);        getline(liness, path, separator);        getline(liness, classlabel);        if(!path.empty() && !classlabel.empty()) {            images.push_back(imread(path, 0));            labels.push_back(atoi(classlabel.c_str()));        }    }}


#########################################################


python实现


#!/usr/bin/env python#-*- coding: utf-8 -*-'''实现csv文件的读出,写入功能'''__author__ = 'zj'import timeimport os#csv文件写入,默认分隔符是';'#参数csv_name表示存储地址#参数rows_list存储写入内容,是列表类型,每个元素代表一行输入内容,同样是列表类型#例:rows_list=[[23,53,'123'], [434, 3, 'dfgv']]def write_csv(csv_name, rows_list, separator=';'):start=time.clock()#打开文件fi=open(csv_name, 'w')#遍历每一行for row in rows_list:#遍历每一列for col in row:fi.write(str(col))fi.write(separator)#endforfi.write("\n")#endforfi.close()end=time.clock()print 'write_csv function need time :%f s'%(end-start)#end of write_csv#csv文件读出,默认分隔符是';'#参数csv_name表示存储地址#参数rows_list存储写出内容,是列表类型,每个元素代表一行输入内容,同样是列表类型#例:rows_list=[[23,53,'123'], [434, 3, 'dfgv']]def read_csv(csv_name, rows_list, separator=';'):start=time.clock()#打开文件fi=open(csv_name, 'r')#读取每一行for line in fi.readlines():#分隔每一列cols=line.split(separator)rows_list.append(cols)#endforfi.close()end=time.clock()print 'read_csv function need time :%f s'%(end-start)#end of read_csvif __name__ == '__main__':#设置存储地址address=os.path.join(os.getcwd(), "test.csv")#设置存储内容rows_list=[[23,53,'123'], [434, 3, 'dfgv']]#写入csv文件write_csv(address, rows_list, ';')lists=[]#读出csv文件read_csv(address, lists, ';')for line in lists:for param in line:print param+" ",#endforprint#endfor#endif

1 0
原创粉丝点击