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