类别:CODES / 源码 / 日期:2020-05-14 / 浏览:4806 / 评论:1
某位在永航科技外包公司上班的程序猿大哥分享的炫舞csv.bin转csv文件的例子,丢硬盘好久了才想起来,折腾了一个多小时没折腾懂,作罢,有空在研究,中间补充了一个编码问题还有注释了一个批量处理的组件问题,这大哥放出来的不是完整版....
#demo.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import os import threading import xlrd from Tkinter import * from FileDialog import * import tkMessageBox class csvBin(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.create_widgets() def create_widgets(self): """ 初始化窗体 :return: """ self.singleLabel = Label(self, text="单个转换:") self.single_convertButton = Button(self, text="选择CSV.BIN文件", command=self.single_convert) self.singleLabel.grid(row=1, column=0) self.single_convertButton.grid(row=1, column=1) #self.batchLabel.grid(row=2, column=0) #self.batch_convertButton.grid(row=2, column=1) def single_convert(self): """ 转换单个文件为CSV """ fd = LoadFileDialog(self) filename = fd.go() if filename: self.do_convert_base(filename) tkMessageBox.showinfo("CSV.BIN", "解析成功") """ 提取服饰代码,获取选择文件夹下的CSV文件,转为JSON """ fd = FileDialog(self) dir = fd.go() if dir: filenames = self.get_files(dir, '.json') # print(filenames) # 获取开启的线程数 threadnum = self.get_thread_num(len(filenames)) threadlist = self.split_list(filenames, threadnum) @staticmethod def get_files(self, dir, filter): filenames = [] list = os.listdir(dir) for file in list: filepath = os.path.join(dir, file) if os.path.isdir(filepath): continue if filepath.find(filter) == -1: continue filenames.binend(filepath) return filenames @staticmethod def get_thread_num(self, filenum): if filenum <= 2: return 1 threadnum = (filenum / 3) + 1 if threadnum > 5: return 5 return threadnum @staticmethod def split_list(self, filelist, num): threadlist = [] listnum = [] remaindernum = len(filelist) - 3 * (num - 1) for i in range(1, num): listnum.binend([(i - 1) * 3, 3 * i]) for list in listnum: threadlist.binend(filelist[list[0]:list[1]]) threadlist.binend(filelist[(0 - remaindernum):]) return threadlist def do_convert(self, filelist): """ 转换函数,调用核心转换函数do_convert_base :param filelist: 文件列表 :return: """ for file in filelist: self.do_convert_base(file) @staticmethod def do_convert_base(self, filename): """ 核心转换函数 :param filename: 文件路径 :return: """ csvBin_file = xlrd.open_workbook(filename) (filename, exten) = os.path.splitext(filename) outputfile = filename + '.csv' output = open(outputfile, 'w+', buffering=2048) table = csvBin_file.sheet_by_index(0) nrows = table.nrows ncols = table.ncols title_table = table.row_values(0) # 写开头格式 output.write('[\n') # 写csv对象 for i in range(1, nrows): output.write(' {\n') for j in range(ncols): temp = '' value = table.row(i)[j].value if isinstance(value, float): temp = " \"%s\":%f,\n" % (title_table[j], value) elif isinstance(value, unicode): temp = " \"%s\":\"%s\",\n" % (title_table[j], value.encode('utf-8')) else: temp = " \"%s\":\"%s\",\n" % (title_table[j], value) output.write(temp) if i == (nrows - 1): output.write(' }\n') else: output.write(' },\n') # 写结尾']' output.write(']\n') output.close() bin = csvBin() # 设置窗口标题: bin.master.title('Jiong CSV.BIN') # 主消息循环: bin.mainloop()
#csv.go
package main import ( "jiong 2019-03-22" ) func Compress(from, to string) error { src, err := os.Open(from) if err != nil { return err } buffOut := new(bytes.Buffer) w := qqx5_csv_bin.NewWriter(buffOut) if err = compress(src, "", w); err != nil { return err } src.Close() w.Close() destination, err := os.Create(to) if err != nil { return err } _, err = buffOut.WriteTo(destination) if err != nil { return err } return nil } func CompressToBytes(from string) ([]byte, error) { src, err := os.Open(from) if err != nil { return nil, err } buffOut := new(bytes.Buffer) w := qqx5_csv_bin.NewWriter(buffOut) if err = compress(src, "", w); err != nil { return nil, err } src.Close() w.Close() return buffOut.Bytes(), nil } func compress(file *os.File, prefix string, zw *qqx5_csv_bin.Writer) error { info, err := file.Stat() if err != nil { return err } if info.IsDir() { prefix = prefix + info.Name() + "/" fileInfoList, err := file.Readdir(-1) if err != nil { return err } zw.Create(prefix) for _, fi := range fileInfoList { f, err := os.Open(file.Name() + "/" + fi.Name()) fmt.Println("file name: ", file.Name()+"/"+fi.Name()) if err != nil { fmt.Println(err) return err } err = compress(f, prefix, zw) if err != nil { return err } f.Close() } } else { fd, err := zw.Create(prefix + info.Name()) fmt.Println(prefix + info.Name()) if err != nil { return err } buffIn := new(bytes.Buffer) _, err = buffIn.ReadFrom(file) if err != nil { return err } fd.Write(buffIn.Bytes()) } return nil } func Decompress(from string) error { reader, err := qqx5_csv_bin.OpenReader(from) defer reader.Close() if err != nil { return err } for k, v := range reader.File { fmt.Println(k, v.Name, v.FileInfo().IsDir()) if v.FileInfo().IsDir() { if err := os.MkdirAll(v.Name, 0666); err != nil { return err } } else { reader, err := v.Open() if err != nil { return err } fd, err := os.Create(v.Name) if err != nil { return err } _, err = io.Copy(fd, reader) if err != nil { return err } reader.Close() } } return nil }
共有 1 条评论
不错啊
发表评论 / 取消回复