Python中两个文本文件之间的数据比较

时间:2017-11-28 17:09:00

标签: python python-2.7

我是编程新手,我需要帮助。我之前已经问过类似的问题,但我发现的只是两个txt文件之间的数据匹配。

我有两个txt文件(Aout.txt和Bout.txt),我使用python从日志文件中提取数据。

Aout.txt和Bout.txt都有类似的数据,需要交叉此信息并获取finaloutput.txt

这里是Aout.txt的样本:

----------------------------

Thu Nov  2 15:53:19 2017 Info: New SMTP ICID 111111 interface (1.2.3.4) address 5.6.7.8 reverse dns host  verified yes
Thu Nov  2 15:53:21 2017 Info: MID 22222 ICID 111111 From: <example@test.com>
Thu Nov  2 15:53:23 2017 Info: MID 22222 ICID 111111 RID 0 To: <receive@acme.com>
Thu Nov  2 15:53:27 2017 Info: MID 22222 Subject 'TEST'


----------------------------

Bout.txt的样本:

----------------------------

1509654863.891601 info msg 22222 : bytes 332 from <example@test.com> qp 0 uid 0
1509654864.031506 starting delivery 654321: msg 22222 to remote receive@acme.com
1509654864.863334 delivery 654321: success: 9.8.7.6_accepted_message./Remote_host_said:_250_2.6.0_<123@mailserver.com>_[InternalId=1122334455]_Queued_mail_for_delivery/


----------------------------

我需要查看msg&#39; Number&#39;来自Bout.txt与MID&#39; Number&#39;相同来自Aout.txt。如果它们匹配,那么我需要检查来自Bout.txt的该消息是否有传递成功。如果为true,则finaloutpout将是Aout.txt中第一行的相同消息

finaloutput.txt:

----------------------------

Thu Nov  2 15:53:19 2017 Info: New SMTP ICID 111111 interface (1.2.3.4) address 5.6.7.8 reverse dns host  verified yes

----------------------------

如果我能得到

address 5.6.7.8

本身在不同的输出文件中。这将是完美的。

我确实计算了成功的输出消息,它们已超过4600并且正在增加。

任何帮助都将受到赞赏,我使用的是python 2.7

感谢。

我使用这些代码来提取Aout.txt和Bout.txt

import os
import glob

indir="C:\\Users\\Mail Logs"
os.chdir(indir)
list_of_files = glob.glob('*')           # create the list of file
FO = open("C:\\Users\\Result\\Aout.txt", 'w')
file_list=[]
for file_name in list_of_files:
    file_list.append(file_name)



for file_name in file_list:
  FI = open(file_name, 'r')

  for line in FI:
      if 'New SMTP ICID' in line:
           FO.write('\n')
           FO.write("\n----------------------------\n")
           FO.write('\n')
           FO.write(line)
      elif 'From:' in line:
           FO.write(line)
      elif 'To:' in line:
           FO.write(line)
      elif 'Subject' in line:
           FO.write(line)     



  FI.close()
FO.close()

和Bout.txt

import os
import glob

indir="C:\\Users\\Qmail logs"
os.chdir(indir)
list_of_files = glob.glob('*')           # create the list of file
FO = open("C:\\Users\\Result\\Bout.txt", 'w')

file_list=[]
for file_name in list_of_files:
    file_list.append(file_name)


for file_name in file_list:
  FI = open(file_name, 'r')

  for line in FI:
      if 'info msg' in line:
           FO.write('\n')
           FO.write("\n----------------------------\n")
           FO.write('\n')
           FO.write(line)
      elif 'starting delivery' in line:
           FO.write(line)
      elif 'success' in line:
           FO.write(line)
      elif 'deferral' in line:
           FO.write(line)   
      elif 'failure' in line:
           FO.write(line)  


  FI.close()
FO.close()

1 个答案:

答案 0 :(得分:0)

首先,您可以立即开始将问题分解为几个更小,更易于管理的工作块。你有许多假定的操作。

您将搜索,比较,提取和写入磁盘。不幸的是,基于所提供的信息,搜索将是解决方案中效率最低的部分。

您必须分析两组数据。你应该首先编写函数来处理这个而不是攻击问题。分而治之!

def scan_log_file(file, search_term):
    # Scan over the given input and determine if the search term is present
    ....
    # Your implementation here

def extract_host(data):
    # Return your host address from the input data
    ...
    return address

def extract_message_id(data):
    # given a line that may include the message id, search it
    ...
    return message_id

def write_file_data(filename, data):
    # Here you append data to the file you want
    ...

因此,实际搜索文件数据。您可以使用正则表达式来很好地实现这一点。如果你不熟悉它们,现在是了解它们的好时机。它们在您的工具带中非常有用。

例如,您可以使用以下内容查找邮件ID:

import re
results = re.search('address (\d\.\d.\d.\d)')
results.group(0) # get the first accepted group, i.e the host address

您可以迭代第一个数据集,提取消息ID,然后对第二个集执行扫描,提取主机地址,将第一个集的比较写入文件finaloutput.txt,将主机地址写入文件host_results.txt。

这是一个相当天真的实现。但它应该让你开始。我不确定你的文件最终会变得多大,但我还建议你查看生成器,以便在较小的流中逐位读取日志文件,而不是将大量数据集批量加载到内存中

但与现有评论非常相似。可以根据您的数据假设进行优化。它可以预测吗?是否需要进行转换,格式化等...

我建议稍微填写一下你的问题,以便更好地了解问题的范围和细节