类别:Codes / 日期:2020-05-14 / 浏览:4320 / 评论:1

    某位在永航科技外包公司上班的程序猿大哥分享的炫舞csv.bin转csv文件的例子,丢硬盘好久了才想起来,折腾了一个多小时没折腾懂,作罢,有空在研究,中间补充了一个编码问题还有注释了一个批量处理的组件问题,这大哥放出来的不是完整版....

炫舞bin转csv表格例子  csv bin python go x5 炫舞 反序列 第1张

    #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 条评论

user 访客 / 2023-10-20 10:59:23 / Windows 10 x64 / Google Chrome 114.0.5735.289 / 回复

不错啊

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。