我有针对用户和电子邮件的数千行日志输出,这些输出是由将许可证分配给那些用户以使用某些资源的应用程序生成的。
现在的情况是,我每周都会导出这些txt列表,我想将它们进行比较并获得新用户的许可,这样我就可以制作报告了。
说,我有上周导出的文件之一,想要与本周导出的文件进行比较,并输出在这段时间内获得许可的新用户。
我想获取的是文件A的第1行,并将其与文件B中的所有行进行比较。
然后获取文件A的第2行,并将其与文件B的所有行进行比较。
以此类推。
f1 = open("logs/older_output.txt", "r")
f2 = open("logs/newer_output.txt", "r")
for line1 in f1:
line1 = line1[0:50]
for line2 in f2:
line2 = line2[0:50]
if line1 == line2:
print("match: ", line1)
f1.close()
f2.close()
现在,该代码段将在两行之间输出匹配项,例如1 = 1行和2 = 2行。
但是真的有必要将A的每一行与B的每一行进行比较吗? 没有其他更简单/有效的方法来实现这一目标吗?
答案 0 :(得分:1)
如果文件非常相似(例如文件b只是文件a加上一些额外的行),则可以将其与为此目的而设计的diff
命令行工具进行比较:
diff logs/older_output.txt logs/newer_output.txt
或者,如果newer_output.txt
包含older_output.txt
中的所有内容以及一些额外的行,则可以直接跳到Python中的那些额外的行:
with open('logs/older_output.txt') as f1, open('logs/newer_output.txt') as f2:
old_n_lines = len(list(f1))
new_lines = list(f2)[old_n_lines:]
或者,如果newer_output.txt
中的每一行都可能位于older_output.txt
中的任何地方,那么如果将older_output.txt
中的行放在{{1}中,则可以更快地进行交叉搜索。进行比较之前。无论集合中有多少项,您都可以立即搜索整个集合,这比对set
中的每一行进行测试要快得多。这样可以做到:
old_output.txt
如果您只想匹配该行的一部分,则可以将其修改为仅适用于该部分。
答案 1 :(得分:0)
Pandas库使您相对容易地做到这一点。我假设每一行上只有一个电子邮件地址。如果您有多个字段,则必须共享示例文件以获取更具体的解决方案。
import pandas as pd
file_a = pd.read_csv('logs/newer_output.txt',header=None,names=['email'],sep=',')
file_b = pd.read_csv('logs/older_output.txt',header=None,names=['email'],sep=',')
new_emails = file_a.loc[~file_a.iloc[:,0].isin(file_b.iloc[:,0])].iloc[:,0].to_list()
如果文件中的列用除列之外的其他任何分隔符,则需要将“ sep =','”部分更新为制表符,空格或任何分隔符。