?部分來自WeTab AI PRO
1.在文末添加一行文字
def add_endline(filename, texts): # 文本末尾增加一行with open(filename, 'a') as file:file.write(f'\n{texts}')file.close()
當使用?open()
?函數打開文件時,第二個參數指定了文件的打開模式。常見的文件打開模式包括:
'r'
:讀取模式(默認)。打開文件用于讀取。如果文件不存在,拋出異常。'w'
:寫入模式。打開文件用于寫入。如果文件存在,則清空文件內容;如果文件不存在,則創建新文件。'a'
:追加模式。打開文件用于寫入,在文件末尾追加內容。如果文件不存在,則創建新文件。'r+'
:讀寫模式。打開文件用于讀取和寫入。'b'
:二進制模式。與上述模式結合使用,用于處理二進制文件,如圖片或視頻文件。
這些模式可以單獨使用,也可以與其他模式組合使用,例如?'rb'
?表示以二進制模式讀取文件。根據你的需求選擇適當的模式來打開文件。
?2.讀取文本的最后幾行
def read_lastlines(filename, n):with open(filename, 'r') as file:lines = file.readlines() # 讀取到的行,格式是一個列表,每一行文字是列表的一個元素return lines[-n:]# 輸出:['2#濕板拋廢檢測輥周長:250.0\n', '1#干板拋廢檢測輥周長:250.0\n', '2#干板拋廢檢測輥周長:250.0']
?注意,readlines()的返回值是一個列表,文本文件的每一行字符是列表的一個元素。除最后一行外,別的行都是以\n(換行符)結尾的。因此,如果進一步需要獲取每一行的文字,需要用到strip()將換行符去掉
demo
filename = "example.txt"
texts = """lin1lin2lin3lin4lin5lin6
"""with open(filename, 'w') as file:file.write(texts)file.close()def read_lastlines(file_name, n):with open(file_name, 'r') as f:lines = f.readlines()return lines[-n:]last_lines = read_lastlines(filename, 3)
for line in last_lines:print(line)# print(line.strip())
上面的方法使用了readlines() 函數,缺點是需要將整個文件全部加載讀取,當文件比較大時效率比較低。下面的代碼使用內置的文件處理功能和collections.deque
。這樣可以高效地處理大文件,因為不需要讀取整個文件到內存中。
collections.deque
函數的詳解:【Python】詳解 collections.deque-CSDN博客
下面是一個實用中的示例代碼,展示了如何實現這個功能:
import collectionsfilename = "example.txt"
texts = """this line1this line2this line3this line4this line5this line6
"""with open(filename, 'w') as file:file.write(texts)file.close()def read_lastlines(filename, n):with open(filename, 'r') as file:deque_lines = collections.deque(file, maxlen=n) # 使用deque(隊列),設置最大長度為nout_lines = [[line.strip('\n')] for line in list(deque_lines)] # 去掉換行符return out_lines# 調用函數
n = 5 # 你想讀取的行數
filename = 'example.txt' # 你的文件名
last_n_lines = read_lastlines(filename, n)print(last_n_lines)# 輸出:[[' this line2'], [' this line3'], [' this line4'], [' this line5'], [' this line6']]
?這個腳本將文本的最后幾行讀出后,去掉換行符,并且輸出為一個列表
3.讀取CSV表格的最后幾行
下面是一個實用中的示例代碼,功能是從一個CSV表格中讀取最后幾行并展示,這是一個很龐大的生產記錄表,如果讀取全部的行就很效率低下,使用了隊列之后就很高效:
import os
import collections
import sysfrom PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItemdef read_lastlines(filename, n):with open(filename, 'r') as file:deque_lines = collections.deque(file, maxlen=n) # 使用deque(隊列),設置最大長度為nout_lines = [[line.strip('\n')] for line in list(deque_lines)]return out_linesdef load_csv(table_widget, file_path, n, top_row): # top_row是置頂行的內容,一般為表格標題和列名稱lines = read_lastlines(file_path, n)line_list = [line[0].split(',') for line in lines]line_list.insert(0, top_row[1])line_list.insert(0, top_row[0])# print(line_list)table_widget.setRowCount(len(line_list))table_widget.setColumnCount(len(line_list[0]))for row in range(len(line_list)):for column in range(len(line_list[row])):item = QTableWidgetItem(line_list[row][column])# print(line_list[row][column])item.setFlags(item.flags() ^ Qt.ItemIsEditable) # 禁止編輯font = QFont()font.setFamily("Arial") # 設置字體font.setPointSize(16) # 設置字號item.setFont(font)table_widget.setItem(row, column, item)table_widget.resizeColumnsToContents() # 自動調整列寬def main():app = QApplication(sys.argv)window = QMainWindow()window.resize(800, 600)window.setWindowTitle("PyQt5 QMainWindow Example")window.table_csv = QTableWidget(window) # 為表格創建顯示tablewindow.table_csv.verticalHeader().setVisible(False) # 隱藏行號window.table_csv.horizontalHeader().setVisible(False) # 隱藏列號top_row = [[" ", " ", " ", " ", "生產統計記錄表 ", " ", " ", " ", " ", " "],["起始時間", "結束時間", "生產線", " 總產量(米)", "濕板拋廢(米)", "干板拋廢(米)","總成品率(%)"," 總廢品率(%)", "濕板廢品率(%)","干板廢品率(%)"]] # 表格的表頭和首行內容file_path = 'history.csv'if not os.path.isfile(file_path): # 文件不存在,創建文件with open(file_path, 'w') as file: # 寫方式打開文件file.write("新建的表格") # 創建一個空文件或可以添加一些初始文本load_csv(window.table_csv, file_path, 5,top_row) # 加載和顯示csvwindow.setCentralWidget(window.table_csv)window.show()sys.exit(app.exec_())if __name__ == '__main__':main()