类别:CODES / 源码 / 日期:2020-05-14 / 浏览:5948 / 评论: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 条评论
不错啊
发表评论 / 取消回复