[爆卦]python讀取txt檔路徑是什麼?優點缺點精華區懶人包

為什麼這篇python讀取txt檔路徑鄉民發文收入到精華區:因為在python讀取txt檔路徑這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者papple23g (逆道者)看板Python標題Re: [問題] 抓取txt特定內容並作註解o...



獲取數值可以用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)




--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.6.172 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1581057249.A.E3A.html
※ 編輯: papple23g (61.216.6.172 臺灣), 02/07/2020 14:41:13
billdarkest: 感謝 覺得比我想像中的還要困難 晚上再慢慢消化吸收 02/07 15:29
billdarkest: 謝謝! 02/07 15:29
zorogto: 推 基礎範本 02/13 07:37
cuteSquirrel: push 02/13 16:49

你可能也想看看

搜尋相關網站