部分来自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()