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()的参数为空,那么会默认删除字符串头和尾的空白字符(包括\n,\r,\t这些)。所以可以对原二维数组除去空格字符
str
- 字符串可以通过 == 号进行判断是否相等,无论这个字符串的位置位于何处,即使是在数组中
- 字符串可以通过
s[x:y]
的方式返回字符串s在x到y - 1的所有字符的字符串 - 字符串可以通过
int(s)
方式转化成字符串,整数类型也可以通过str()
方式进行转换成字符类型
dict
- 字典可以通过
d[key]
的方式获取值,也可以通过d.get(key)
方式获取值
字符
- python 不使用
&& ||
等方式进行条件的判断 - \n 是转义字符,表示换行