类别:CODES / 源码 / 日期:2020-05-14 / 浏览:4914 / 评论: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
}

 可能感兴趣的文章

伤心叹戈

评论区

共有 1 条评论

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

不错啊

发表评论 / 取消回复

必填

选填

选填

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

近期评论