1 博客内容
练手任务,需要将约100份Excel文件固定列数据转16进制,该列中每行数据存放一起,生成txt。生成的数据前加固定的Information及原excel名称为编号。程序实现提取excel固定列数据转16进制,并保存为txt。
2 数据转换
文件存放路径:D:\SoftApp\Python\EOL\H
文件名及内容:
- 文件1:XA_1900001.xls,内容:
- 文件2:XA_1900002.xls,内容:
| - 文件3:XA_1900003.xls,内容:
使用Python编程如下:
"""
名称: Translation.py
作者: Morven_Xie
版本: 1.0
时间: 2020/7/21 15:08
功能: 用于提出excel固定列数据转16进制,并保存为txt文件
简介: ·提取第6列出具,该列每行数据单位由1变为0.001,保留整数位转16进制;
·提取第12列出具,该列每行数据单位由1变为0.01,保留整数位转16进制;
·提取excel文件名,截取AAA000_000002.xls中序号部分,作为txt文件名及起始内容;
Email: morven_xie@163.com
"""
# coding=utf-8
import os # 用于获取文件路径
import xlrd # 用于一次读取Excel中的整行数据
# def delete_bytes_hex(data): # 备用函数,打印16进制0X2A时取消0X
# lin = ['%02X' % i for i in data]
# n = (" ".join(lin))
# return n
def extract(inpath): # 创建函数
data = xlrd.open_workbook(inpath, encoding_override='utf-8') # 打开指定地址excel
table = data.sheets()[0] # 打开索引顺序获取excel
nrows = table.nrows # 获取行号
ncols = table.ncols # 获取列号
exfile=open('A_transition.txt', "w") # W为清空原txt内容重新写入
for i in range(5, nrows): # 循环输出excel表中每一行,即所有数据
datas_row = table.row_values(i) # 循环输出excel表中每一行,所有列的数据
if i%50 !=0: # 取消表中某一行不读取
k= int(round(float(datas_row[1]), 3)*1000) # 提取某i行第二列数据取整,转化为int类型
m = hex(k) # 10进制转16进制
result = (format(k, "x").zfill(4)) # 不足4位的前面补充0
exfile.write(result) # 16进制数据写入transition.txt
for i in range(5, nrows): # 同上,第0到4行为表头,从第5行开始
datas_row = table.row_values(i)
if i % 50 != 0:
if isinstance(datas_row[5], str): # 判断单元格内容是否为空
n = 0 # 为空则输出0
else:
n = datas_row[5] # 为不为空则输出实际值
k = int(round(float(n), 2) * 100) # n取小数点后两位小数,单位转化0.01
m = hex(k) # 10进制转16进制
result = (format(k, "x").zfill(4)) # 同上
exfile.write(result) # 16进制数据写入transition.txt
exfile.write('_B8B8') # 加入特定结尾字符串
exfile.close() # 关闭transition.txt
file_path = "D:\SoftApp\Python\EOL\H" # 文件所在文件夹
for root, dirs, files in os.walk(file_path): # os.walk返回三个对象: dirpath(目录路径,string类型)
# dirname(多个子目录名,列表); filename(多个文件名,列表)
path = [os.path.join(root, name) for name in files] # 遍历文件名对应的地址(3个文件地址)
for file_adress in path: # 如果地址为真(不为空)
extract(file_adress) # 调用def extract(inpath)函数
filename=str(file_adress.split('\\')[-1].split('.')[0]) # 提取地址中文件名
with open(filename + ".txt", 'a') as f: # 新建txt,且其名称来自excel名称
f.write('Info_XA_AA001_'+str(filename)+'_') # 将固定信息先写入txt中
if __name__ == '__main__': # 拷贝函数的txt文件内容,追加到新txt
fp = open('A_transition.txt', 'r')
for line in fp:
f.write(line)
fp.close() # 关闭文件
f.close()
os.remove('A_transition.txt') # 移除中转文件
运行结果:
XA_1900001.txt,内容:
Info_XA_AA001_XA_1900001_00320014001e00280032003c00460050005a0064006e00780082008c009600a000aa00b400be00c8000a0003000500500007002b0095035303a3034802da03510411041b04e304e4000000000000000000000000_B8B8
XA_1900002.txt,内容:
Info_XA_AA001_XA_1900002_0014000000000000000003d91f46226a1ed91a8d1f3326b327182ee82ef22efc2f062f102f1a2f24001400020000000000000000006203210371031602a8031f03df03e904b104b2000000000000000000000000_B8B8
XA_1900003.txt,内容:
Info_XA_AA001_XA_1900003_001e000000000000000003d91f46226a1ed91a8d1f3326b327182ee82ef22efc2f062f102f1a2f24001e00030000000000000000006203210371031602a8031f03df03e904b104b2000000000000000000000000_B8B8