现有两个密码文件pass1.txt
、pass2.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()
读取下一行
在上述案例中 变量 i1
、i2
起到了控制循环次数的作用;line1
、line2
标识文件的行数,并决定了循环的最大值(次数)eval()
函数,的参数是一个表达式,函数返回的值是参数运算的结果,在以上代码中eval(linelist1[0])
表示函数的返回值是这个列表的第一个元素