类别:CODES / 源码 / 日期:2020-05-14 / 浏览:5366 / 评论: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 }
#csv_main.go
package main import ( "fmt" "path/filepath" "os" "log" "bytes" ) func main() { fmt.Println(filepath.Abs("./")) decrypt() } func qqx5_csv_bin() { x5binBytes, err := CompressToBytes("./qqx5_csv_bin") var aesKey = []byte("12345678901234561234567890123456") pass := x5binBytes xpass, err := Aesqqx5_csv_bin(pass, aesKey) if err != nil { fmt.Println(err) return } fd, err := os.Create("./csv.bin") if err != nil { log.Fatal(err) } fd.Write(xpass) fd.Close() } func decrypt() { var aesKey = []byte("12345678901234561234567890123456") fd, err := os.Open("./csv.bin") if err != nil { log.Fatal(err) } buff := new(bytes.Buffer) _, err = buff.ReadFrom(fd) fd.Close() if err != nil { log.Fatal(err) } tpass, err := AesDecrypt(buff.Bytes(), aesKey) if err != nil { fmt.Println(err) return } //fmt.Printf("解析后: %s\n", tpass) fd, err = os.Create(".csv") if err != nil { log.Fatal(err) } fd.Write(tpass) fd.Close() }
demo.py运行的时候报了一个错误,有兴趣的可以研究一下。
Exception in Tkinter callback Traceback (most recent call last): File "C:\Files\Python27\lib\lib-tk\Tkinter.py", line 1547, in __call__return self.func(*args) File "D:\Bogie\开源代码\例子\CSV\csv.bin\demo.py", line 40, in single_convertself.do_convert_base(filename) TypeError: do_convert_base() takes exactly 2 arguments (1 given)
版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用 / Article Is Not Licensed Under Any Creative Commons License, And You May Freely Reprint Or Use It In Any Form
共有 1 条评论
不错啊
发表评论 / 取消回复