本帖最后由 dyliuyunfei 于 2020-3-14 13:06 编辑
前言:
继学习python以来,发布的自己第一个小程序“疫情宅家学习Python,提取文件名工具,设计师可用小工具”后,这次的目标是做个公司的下单系统
(有兴趣的朋友可以看看原贴:https://www.52pojie.cn/thread-1100889-1-1.html)
才发现要学习的太多了~ 现在基本恢复上班,时间变少了,不过不急,慢慢来,呵呵
这次带来的是关于本地文件操作的封包
实现功能:
1、返回文件总行数
2、返回文件所有内容
3、查找关键字行内容
4、写内容
缺点:
暂时没发现,有问题可以回复给我
以下上源码,文件名是:FileMana.py,可单独使用,也可以调用
因为自己是初学者,所以里面大多都用了中文注释
[Python] 纯文本查看 复制代码 # _*_ coding: UTF-8 _*_
# 开发人员: dw
# 开发时间: 2020-03-12 14:47
# 文件名称: FileMana.PY
# 开发工具: PyCharm
# 文件操作
import os
class fileDB:
def __init__(self, path, file, rows=None): # row默认值为不删除超出行数据
self.path = path # 文件路径
os.chdir(path) # 设定当前工作目录
# print("当前工作目录为 %s" % os.getcwd())
self.file = file # 文件名
self.rows = rows # 文件行数
def Line(self): # 获取文件行数
try:
count = 1
fo = open(self.file, mode="r", encoding="utf-8-sig") # 只读方式打开文件,文件必须存在
while True:
buffer = fo.read(8192 * 1024)
# print(buffer)
if not buffer:
break
count += buffer.count('\n')
fo.close() # 关闭文件
return count # 返回文件行数
except:
print("文件" + self.file + "获取行数异常!!")
def readAll(self): # 读取所有内容
try:
count = []
fo = open(self.file, mode="r", encoding="utf-8-sig") # 只读方式打开文件,文件必须存在
while True:
buffer = fo.read(8192 * 1024)
# print(buffer)
if not buffer:
break
count += buffer.splitlines()
fo.close() # 关闭文件
return count # 返回文件内容
except:
print("文件" + self.file + "读取所有内容异常!!")
def find(self, Keyword, only=False): # 查找关键字内容,默认返回全部有关键字行
try:
count = []
fo = open(self.file, mode="r", encoding="utf-8-sig") # 只读方式打开文件,文件必须存在
while True:
buffer = fo.readline()
if buffer.find(Keyword) != -1:
buffer = buffer.replace('\n', '') # 去除换行符
count.append(buffer) # 列表末尾添加符合条件的内容
if only: break # 仅查找一行的话跳出循环
if not buffer: break # 列表读取完成后跳出循环
fo.close() # 关闭文件
return count # 返回文件内容
except:
print("文件" + self.file + "查找关键字异常!!")
def write(self, doc, app=True): # 写文件,app为True:a追加,app为False:从文件开始写内容,文件存在用r+,文件不存在用w新建,默认追加
try:
if app:
Poin = "a" # 追加方式,光标文件尾
fo = open(self.file, mode=Poin, encoding="utf-8-sig") # 根据app值以不同方式打开文件
fo.write("\n" + doc) # 前部加换行符写入文件
fo.close() # 关闭文件
self.rowsLim(app=True) # 去除文件首部超出行
else:
if self.testing(): # 检测文件是否存在
Poin = "r+" # 光标在文件开始处
else:
Poin = "w" # 光标在文件开始处,新建文件
fo = open(self.file, mode=Poin, encoding="utf-8-sig") # 根据app值以不同方式打开文件
old = fo.read() # 新建值读入原表内容
fo.seek(0) # 光标跳到第1行
fo.write(doc) # 写入新数据
fo.write("\n" + old) # 写入老数据,至此完成在文件头部增加内容
fo.close() # 关闭文件
self.rowsLim(app=False) # 去除文件尾部超出行
except:
print("文件" + self.file + "写入异常!!")
def testing(self): # 检测文件是否存在
path = os.path.isfile(self.file)
return path # 返回True或False
def rowsLim(self, app=True): # 行数限制,app为真删除文件前面多余的行,为假删除文件后面多余的行
if self.rows != None:
lines = self.Line() # 读取文件行数
lines = lines - self.rows # 文件行数-预定行数
if lines > 0:
print("文件行数超过 %d 行,已自动删除超出行内容 %d 行" % (self.rows, lines))
fo = open(self.file, mode="r+", encoding="utf-8-sig") # 根据打开文件
doc = fo.read() # 读取文件内容
for i in range(0, lines): # 去除超出行
if app: # app为真,删除文件前面多余的行
doc = doc[doc.find("\n") + 1:]
else: # app为假,删除文件后面面多余的行
doc = doc[:doc.rfind("\n") - 1]
fo.seek(0) # 指针跳到文件头
fo.truncate() # 清空文件内容
fo.write(doc) # 写入文件
fo.close()
if __name__ == "__main__":
filepath = "../Log" # 文件路径
filename = "UnitSet.log" # 文件名
rowsLimit = 10 # 文件行数限制
file = fileDB(filepath, filename, rowsLimit) # 初始化
'''
# 返回文件总行数
lines = file.Line() # 返回文件总行数
print('文件总行数:{}'.format(lines))
# 返回文件所有内容
doc = file.readAll() # 返回文件所有内容
print("读取的文件内容为:\n", doc)
# 查找关键字行内容
key = "2" # 关键字
doc = file.find(key, only=True) # 查找关键字行内容,only为查找单/多选开关,False为查找所有,True查找单个,默认False
print("含有 {0} 的单行内容为:\n {1}".format(key, doc))
# 写内容
import random # 导入 random(随机数) 模块
doc = str(random.randint(0, 100)) # 随机数0-100
file.write(doc, app=False) # True追加写入,False从文件开始处写入,doc必须为单条数据,不能为数组
doc = file.readAll() # 返回文件所有内容
print("读取的文件内容为:\n", doc)'''
注:
class里理论上不用改,在"if __name__ == "__main__":"里三引号调整相关数据即可(三引号里的内容默认是不执行的哈)
|