Re: [问题] 抓取txt特定内容并作注解or计算

楼主: papple23g (逆道者)   2020-02-07 14:34:07
获取数值可以用re.split简单达成
填入文字本来想要用f-string加上\t间隔来排版
发现国字的全角和数字的半角在同一栏时,很难让字段对齐
所以做了一点细部的调整
大致的流程是获得文本list之后,对需要修改的行位做修改,再全部黏起来('\n'.join)覆写回去
Before:
https://i.imgur.com/CQDMUVN.png
After:
https://i.imgur.com/z8ZfxIW.png
程式码:
import re
#设定文字档路径
txt_filepath='path/to/data.txt'
#定义动作:在文字行的串行中获取两个虚线的行索引
def GetDashlineRowIndexes(line_list):
i_dashline_row1=None #第一条虚线的行索引
i_dashline_row2=None #第二条虚线的行索引
#逐行搜寻
for i_row,line_text in enumerate(line_list):
#判定有10个以上的虚线字符即为虚线行
if '-'*10 in line_text:
if not i_dashline_row1:
i_dashline_row1=i_row
else:
i_dashline_row2=i_row
break
#若两条的虚线都有找到
if all([i_dashline_row1,i_dashline_row2]):
return i_dashline_row1, i_dashline_row2
#若两行的虚线有其中一条未找到
else:
raise ValueError('文字档应至少包含两个虚线行')
#定义动作:将单行的数据文字串行输出为单行等宽栏的字串
def RowDataListToOneLine(row_data_list):
#设定固定栏宽
space_len=8
#生成新的单行文字内容
new_line=''
for row_data in row_data_list:
#计算全角字的数量
num_of_fullwidth_chr=sum(ord(s)>126 for s in row_data)
#使用f-string排版,设定向右对齐(根据全角字的数量去教准)
new_line+=f'{row_data:>{space_len - num_of_fullwidth_chr}}\t'
return new_line
#读取所有txt文字
with open(txt_filepath,'r',encoding='utf-8') as f:
text=f.read()
#分割每一行内容做成list
line_list=text.split('\n')
#获取两个虚线的行索引值
i_dashline_row1, i_dashline_row2 = GetDashlineRowIndexes(line_list)
#处理标题列文字行,先获取标题列的行索引
i_header_row=i_dashline_row1 - 1
#获取单行标题列文字并分割为串行
header_line=line_list[i_header_row]
row_data_list=re.split(r'\s+',header_line.lstrip())
#将原标题列字串替换为等宽栏的字串
line_list[i_header_row]=RowDataListToOneLine(row_data_list)
#处理数据列文字行
for i_row in range(i_dashline_row1+1, i_dashline_row2):
#获取单行的数据文字串行
row_data_list=re.split(r'\s+',line_list[i_row].lstrip())
#取左边10栏
row_data_list=row_data_list[:10]
#取得各项数值
W,X,Y,Z,W_w,X_w,Y_w,Z_w=(float(data) for data in row_data_list[2:])
#计算均重,输出文字格式:取至两个小数点并向右对齐(若分母为零则显示0.00)
W_avg=f'{W_w/W:>.2f}' if W else '0.00'
X_avg=f'{X_w/X:>.2f}' if X else '0.00'
Y_avg=f'{Y_w/Y:>.2f}' if Y else '0.00'
Z_avg=f'{Z_w/Z:>.2f}' if Z else '0.00'
#将原数据列字串替换为等宽栏的字串
line_list[i_row]=RowDataListToOneLine(row_data_list +
[W_avg,X_avg,Y_avg,Z_avg])
#重新组成text内容
new_text='\n'.join(line_list)
#覆写档案
with open(txt_filepath,'w',encoding='utf-8') as f:
f.write(new_text)
作者: billdarkest   2020-02-07 15:29:00
感谢 觉得比我想像中的还要困难 晚上再慢慢消化吸收谢谢!
作者: zorogto (卡称)   2020-02-13 07:37:00
推 基础范本
作者: cuteSquirrel (松鼠)   2020-02-13 16:49:00
push

Links booklink

Contact Us: admin [ a t ] ucptt.com