吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2319|回复: 12
收起左侧

[Python 转载] Python 关于文件操作封包

[复制链接]
dyliuyunfei 发表于 2020-3-14 13:04
本帖最后由 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__":"里三引号调整相关数据即可(三引号里的内容默认是不执行的哈)

免费评分

参与人数 1热心值 +1 收起 理由
wl_cs + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
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
求一对一辅导
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 02:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表