dyliuyunfei 发表于 2020-3-14 13:04

Python 关于文件操作封包

本帖最后由 dyliuyunfei 于 2020-3-14 13:06 编辑

前言:
继学习python以来,发布的自己第一个小程序“疫情宅家学习Python,提取文件名工具,设计师可用小工具”后,这次的目标是做个公司的下单系统
(有兴趣的朋友可以看看原贴:https://www.52pojie.cn/thread-1100889-1-1.html)
才发现要学习的太多了~ 现在基本恢复上班,时间变少了,不过不急,慢慢来,呵呵


这次带来的是关于本地文件操作的封包


实现功能:
1、返回文件总行数
2、返回文件所有内容
3、查找关键字行内容
4、写内容


缺点:
暂时没发现,有问题可以回复给我


以下上源码,文件名是:FileMana.py,可单独使用,也可以调用
因为自己是初学者,所以里面大多都用了中文注释
# _*_ coding: UTF-8 _*_
# 开发人员: dw
# 开发时间: 2020-03-1214: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
                  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__":"里三引号调整相关数据即可(三引号里的内容默认是不执行的哈)

dyliuyunfei 发表于 2020-3-14 14:06

xinyangtuina 发表于 2020-3-14 13:49
"文件操作封包“
这个怎么理解 ?

也就是在编另外的程序的时候可以直接调用

dyliuyunfei 发表于 2020-3-14 14:09

18128585589 发表于 2020-3-14 14:02
好难啊,求一对一辅导!!!

百分之90的语句都有注释,再看不懂就需要先学基础了哟

小粉B 发表于 2020-3-14 13:24

python很好玩吧~~

xinyangtuina 发表于 2020-3-14 13:48

有点复杂
学习了

xinyangtuina 发表于 2020-3-14 13:49

"文件操作封包“
这个怎么理解 ?

18128585589 发表于 2020-3-14 14:02

好难啊,求一对一辅导!!!

dyliuyunfei 发表于 2020-3-14 14:07

18128585589 发表于 2020-3-14 14:02
好难啊,求一对一辅导!!!

90%的语句都有注释,再看不懂就需要先学基础了哟

yiwanyiwan 发表于 2020-3-14 14:07

编码不容易

wysyz 发表于 2020-3-14 14:48

求一对一辅导
页: [1] 2
查看完整版本: Python 关于文件操作封包