【python语法】简单的密码归并案例

现有两个密码文件pass1.txtpass2.txt 分别保存了次数(序号)不同的九组密码,要求将密码按照序号顺序由大到小归并到一个新的文件中:

在这里插入图片描述

左边的是序号;右边的是密码

1、读取文件行数

首先需要读取两个文件的行数;

class filelines:
    def __init__(self, filepath):              # 定义类的属性
        self.filepath = filepath               # 接收文件路径
        self.file = open(filepath, 'rb')       # 用读取为二进制的方法打开文件
        self.Line = -1                         # 表示未读取文件

    def readlines(self):                       # 定义类的行为(读取文件行数)
        i = 0                                  # i:标识文件行数
        while True:                            # 读取文件的循环
            linestr = self.file.readline()     # 读取一行 
            if linestr:                        # 打印,并统计
                print(linestr)
                i += 1
                self.Line = i                  # 将最后的值赋值给类用来标识文件行数的属性
            else:
                break                          # 读完所有行、结束这个循环
f1 = filelines(r'G:\新建文件夹\python\pure python\day01 类与面向对象\归并数据\pass1.txt')
f1.readlines()
print(f1.Line)
f2 = filelines(r'G:\新建文件夹\python\pure python\day01 类与面向对象\归并数据\pass2.txt')
f2.readlines()
print(f2.Line)

定义一个类,类的属性有这几种功能:接收文件的路径、以读取二进制的形式打开对应的文件、将行数的初值设置为 -1 表示没有读取相关行;

2、根据不同的序号进行数据归并

函数的参数有三个值,分别代表需要被归并的两个文件目录,和将归并的结果输出到的文件目录,在上述案例中,我们已经得出了带归并文件有九行密码的结果了所以这次直接写死;接下来读取文件每一行的序号和密码,并通过split()函数进行分割;通过对比序号值大小(分三种情况)依次写入对应文件。

def merge(path1,path2,path3):
    file1 = open(path1,'rb')
    file2 = open(path2,'rb')
    file3 = open(path3,'wb')                  # 三个文件路径,前两个是读取,第三个是写入归并结果
    lines1 = 9                                # 文件行数以获取
    lines2 = 9
    i1 = 0                                    # 开始读取文件
    i2 = 0
    linestr1 = file1.readline()
    linestr2 = file2.readline()
    while i1 < lines1 and i2 < lines2:        # 将读取出的每一行分割成[序号,密码]的形式
        linelist1 = (linestr1.decode('utf-8')).split(' ')
        linelist2 = (linestr2.decode('utf-8')).split(' ')
        # print(linelist1)                    # 打印检查分割出的列表
        # print(linelist2)
        if eval(linelist1[0]) > eval(linelist2[0]):   # 比较序号并依次写入文件(分三种情况)
            file3.write(linestr1)
            i1 += 1
            linestr1 = file1.readline()
        elif eval(linelist1[0]) < eval(linelist2[0]):
            file3.write(linestr2)
            i2 += 1
            linestr2 = file2.readline()
        else:
            file3.write(linestr1)
            file3.write(linestr2)
            i1 += 1
            i2 += 1
            linestr1 = file1.readline()
            linestr2 = file2.readline()



    file1.close()
    file2.close()
    file3.close()

merge(r"G:\新建文件夹\python\pure python\day01 类与面向对象\归并数据\pass1.txt",
      r"G:\新建文件夹\python\pure python\day01 类与面向对象\归并数据\pass2.txt",
      r"G:\新建文件夹\python\pure python\day01 类与面向对象\归并数据\pass12.txt")

三种情况分别是:pass1.txt中的序号较大:写入从pass1中读取的密码

pass2中密码的序号较大:写入从 pass2 中读取的密码

两个文件中的密码序号一致,都写入pass12

写入完成之后,要调整行数,使用readline()读取下一行
在上述案例中 变量 i1i2 起到了控制循环次数的作用;line1line2 标识文件的行数,并决定了循环的最大值(次数)eval()函数,的参数是一个表达式,函数返回的值是参数运算的结果,在以上代码中eval(linelist1[0]) 表示函数的返回值是这个列表的第一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值