" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Python 处理 Excel 文件、数据

PySuper
2020-10-13 / 0 评论 / 0 点赞 / 13 阅读 / 8371 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

0占位

return_table_num = lambda x: str(x).zfill(2)
return_table_num(1)

>> 01

小数点取值

num = float(content.strip("\n"))
if num < 1:  # 当a < 1 , 小数点后取7位
    item = "{:.7f}".format(num)
    item = item[1:]
if num > 1:  # 当a > 1 , 小数点后取6位
    item = "{:.6f}".format(num)

等分列表

将列表四个四个分组

匿名函数

new_list = lambda list_: map(lambda b: list_[b:b + 4], range(0, len(list_), 4))
print(list(new_list(list_)))

列表推导式

print([list_[i:i + 4] for i in range(0, len(list_), 4)])

代码

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author   : Zheng Xingtao
# File     : save_txt_x.py
# Datetime : 2020/10/12 下午3:24


import os
import xlrd
from settings.dev import BASE_DIR

home_path = "/home/zheng/Documents/WorkFile/TEST"  # XLS文件 所在的文件夹 绝对路径\
file_init = "RA 60kmph run01"  # 单个XLS文件名
hz = 300  # 获取到多少行的数据

file_path = home_path + "/"
file_name = file_init + ".xls"


class ReadXls(object):
    def __init__(self, file_name, hz):
        """
        已知从第二列开始
        """
        self.hz = hz
        self.file_name = file_name
        self.file = file_path + file_name
        self.sheet = xlrd.open_workbook(self.file).sheet_by_name('Sheet1')  # 标签名
        self.row_start = self.row_end = self.column_start = self.column_end = 1

    def get_location(self):
        """
        获取当前文件中数据的起始位置
        :return: 位置数据
        """
        # A1-B1  A3-B3
        for row in range(self.sheet.nrows):
            value = self.sheet.row_values(row)[0]
            if value == "":
                self.row_start = row
                self.row_end = self.row_start + self.hz + 1  # 索引特性

        column_list = []
        for column in range(1, self.sheet.ncols):
            value = self.sheet.col_values(column)[self.row_start]
            if value == "":
                column_list.append(column)
        self.column_end = column_list[0]

    def read_file(self):
        """
        从文件中数据的起始位置获取数据
        :param row_start: 开始行
        :param row_end: 结束行
        :param column_start: 开始列
        :param column_end: 结束列
        :return: 多个数据的列表
        """
        for column in range(self.column_start, self.column_end):
            dat = []
            for a in range(self.row_start, self.row_end):
                cells = self.sheet.row_values(a)
                data = str(cells[column])
                dat.append(data)
            yield dat

    def save_txt(self, item):
        """
        将当个数据写入txt文件
        :param item: 单个数据列表
        :return:
        """
        result_name = item[0].replace(" ", "") + ".txt"
        result_path = file_path + self.file_name[:-4]
        if os.path.exists(result_path) is False:
            try:
                os.makedirs(result_path)
            except:
                print("文件夹创建失败,请检查文件夹权限!")
        try:
            with open(result_path + "/" + result_name, 'w') as f:

                # 从这里开始写入数据到txt文件中
                save_path = result_path + "/" + result_name
                return item[1:], save_path
                # for num in item[1:]:
                #     f.write(num)
                #     f.write("\r\n")
        except:
            print("数据写入失败,请确认文件存储路径!")

    def run(self):
        """
        执行函数
        :return: 程序执行结果
        """
        self.get_location()
        for item in self.read_file():
            yield self.save_txt(item)


class SaveTxtTable(object):
    def read_table(self):
        """读取txt_table中的信息"""
        model = ""
        model_file_path = '/home/zheng/Documents/WorkFile/INFO/help/txt_table.txt'
        with open(model_file_path, 'r') as f:
            for content in f.readlines():
                if content != None:
                    # 从文件中读取行数据时,会带换行符,使用strip函数去掉 换行符后存入列表
                    model = content.strip("\n")
            f.close()
        return model

    def save_txt_table(self, file_name, table_name, model):
        """将txt中的信息 按照指定格式 写入到txt_table中"""
        return_table_num = lambda x: str(x).zfill(2)
        table_num = return_table_num(table_name)
        with open(file_name, 'w') as f:
            # table信息
            f.write(model + '\r\n')
            f.write("TABLED1 {}LINEAR  LINEAR +0000001".format(table_num) + '\r\n')
            f.close()

    def read_txt(self):
        """
        读取txt中的信息
        :return: txt_table中需要的数据格式
        """
        txt_info = []
        with open("HL_R_XDIC24X014.txt", 'r') as f:
            for content in f.readlines():
                if content != None:
                    num = float(content.strip("\n"))
                    if num < 1:  # 当a < 1 , 小数点后取7位
                        item = "{:.7f}".format(num)
                        item = item[1:]
                    if num > 1:  # 当a > 1 , 小数点后取6位
                        item = "{:.6f}".format(num)
                    txt_info.append(item)
            f.close()

        # 将文件的数据四个四个分组
        # 匿名函数
        new_list = lambda list_: map(lambda b: list_[b:b + 4], range(0, len(list_), 4))
        # print(list(new_list(list_)))

        # 列表推导式
        # print([list_[i:i + 4] for i in range(0, len(list_), 4)])
        return list(new_list(txt_info))

    def write_num(self, file_name, table_name, num_list):
        """
        这里是我们从获取excel里面就保存txt_table
        还是从txt中转换
        :return:
        """

        # 返回每行的序号
        return_sort_index = lambda x: str(x).zfill(7)

        model = self.read_table()
        self.save_txt_table(file_name, table_name, model)
        # txt_list = self.read_txt()

        # 把列表四个四个分割
        num_list = num_list
        new_list = lambda list_: map(lambda b: list_[b:b + 4], range(0, len(list_), 4))
        num_list = list(new_list(num_list))

        with open(file_name, 'a+') as f:
            num_index = 1
            for line_value_list, sort_index in zip(num_list, range(2, len(num_list) + 2)):
                f.write("+{}".format(return_sort_index(sort_index - 1)))

                for content in line_value_list:

                    num = float(content.strip("\n"))
                    if num < 1:  # 当a < 1 , 小数点后取7位
                        item = "{:.7f}".format(num)
                        line_value = item[1:]
                    if num > 1:  # 当a > 1 , 小数点后取6位
                        line_value = "{:.6f}".format(num)

                    f.write('{:>7}.'.format(num_index) + line_value)
                    num_index += 1

                f.write("+{}".format(return_sort_index(sort_index)))
                f.write('\n')

            f.write("+{}".format(return_sort_index(sort_index)) + "ENDT" + "\n")
            f.write("$" * 80 + "\n")
            f.write("$" * 80 + "\n")
            f.close()

    def run(self, file_name, hz):
        table_name = 1
        for excel_num_list, save_path in ReadXls(file_name, hz).run():
            self.write_num(save_path, table_name, excel_num_list)
            table_name += 1

# SaveTxtTable().run(file_name, hz)
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区