Python-修改xls文件示例

具体想法

这段时间通过是使用Windows的番茄盒子,效果不错,但是发现其中有些反面还是有些不足。

  • 数据展示阶段太丑,用的库不好
  • 导出的数组为分为三个时间段,原本相连的内容就分开了,让人不舒服。

为了以后自己能够对这些记录的数据做更好的数据展示优化,我决定自己先对数据进行处理,然后导入数据库库。

遇到两个问题

  • xls文件无法直接通过open函数打开,需要使用xlwt库进行转换。学习成本有点高

具体思路如下

  • 使用panda库直接将原xls文件0转化为csv文件1
  • 对文件1的内容格式化输出到文件2
  • 打开文件2合并之前由系统产生的散乱的记录,并输入到文件3

很浪费存储空间,也浪费时间,但是鉴于这是个人的一个数据量处理,这些内容,忽略不计。反正只是为了满足个人需要。

详细代码

# 目的为了xsl文档到csv文档的转换
import pandas as pd
import csv


def xlsx_to_csv_pd(sourceFile, targetFile):
    """对xls文档进行转化,并且结构进行优化

    :param sourceFile: 原文件名
    :param targetFile: 目的文件名
    :return:   无
    """

    # 初步格式化
    data_xls = pd.read_excel(sourceFile, index_col=0)
    tempFile = "tempFile.csv"
    data_xls.to_csv(tempFile, encoding='utf-8')

    # 格式优化
    lines = open(tempFile, "r", encoding='utf-8').readlines()
    lines = [line.strip() for line in lines]
    total_lines = len(lines)
    line_num = 1
    header = ["data", "startTime", "endTime", "totalTime", "category", "target", "task"]
    data = []
    data.append(header)
    while line_num < total_lines:
        curValues = lines[line_num].split(",")
        curValues[1] = curValues[1][0:10]
        curValues[2] = curValues[2][11:16]
        curValues[3] = curValues[3][11:16]
        del curValues[0]
        data.append(curValues)
        line_num += 1

    # 写入文件存储
    with open(targetFile, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        for each_line in data:
            writer.writerow(each_line)
        csvfile.close()

def merge(input_file, output_file):
    """ 将原本的散乱记录进行一定程度的合并

    :param input_file:  输入文件
    :param output_file:  输出文件
    :return:
    """
    lines = open(input_file, "r", encoding='utf-8').readlines()
    lines = [line.strip() for line in lines]

    total_lines = len(lines)
    line_num = 1
    data = []
    # 判断是否记录散乱
    dictNum = {"07:59": "08:00", "12:59": "13:00", "18:59": "19:00"}
    data.append(lines[0].split(","))
    while line_num < total_lines:
        curValues = lines[line_num].split(",")
        nextNum = line_num + 1
        if nextNum < total_lines:
            nextValues = lines[nextNum].split(",")
            if curValues[4] == nextValues[4] and dictNum.get(curValues[2]) == nextValues[1]:
                curValues[3] = str(int(curValues[3]) + int(nextValues[3]))
                del lines[line_num + 1]
                total_lines = total_lines - 1
        data.append(curValues)
        line_num += 1

    with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        for each_line in data:
            writer.writerow(each_line)
        csvfile.close()


if __name__ == '__main__':
    xlsx_to_csv_pd("box1.xls", "box1_temp.csv")
    merge("box1_temp.csv", "box1.csv")

经验教训

list

  • 可以通过类似java方式进行数组的读取。比如一维数组可以采用 list1[0],二维数组可以采用list1[0][0]的方式进行获取
  • list.strip(),如果strip()的参数为空,那么会默认删除字符串头和尾的空白字符(包括 , , 这些)。所以可以对原二维数组除去空格字符

str

  • 字符串可以通过 == 号进行判断是否相等,无论这个字符串的位置位于何处,即使是在数组中
  • 字符串可以通过s[x:y]的方式返回字符串s在x到y - 1的所有字符的字符串
  • 字符串可以通过int(s)方式转化成字符串,整数类型也可以通过str()方式进行转换成字符类型

dict

  • 字典可以通过d[key]的方式获取值,也可以通过d.get(key)方式获取值

字符

  • python 不使用&& || 等方式进行条件的判断
  • 是转义字符,表示换行
原文地址:https://www.cnblogs.com/Di-iD/p/13785083.html