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

2024-04-25 07:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,需要帮助。我知道以前也有人问过类似的问题,但我发现的只是两个txt文件之间的数据匹配。你知道吗

我有两个txt文件(Aout.txt文件以及布特.txt)我用python从日志文件中提取数据。你知道吗

两者Aout.txt文件以及布特.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'


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

样品布特.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/


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

我需要检查一下是否有来自布特.txt与中的“数字”相同Aout.txt文件. 如果它们匹配,那么我需要检查来自的消息是否传递成功布特.txt. 如果为true,那么finalOutput将是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条,而且还在增加。你知道吗

任何帮助都将不胜感激,我正在使用python2.7

谢谢。你知道吗

我用这些代码来提取Aout.txt文件以及布特.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()

以及布特.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()

Tags: 文件ofnameintxtforlineglob
1条回答
网友
1楼 · 发布于 2024-04-25 07:32:44

首先,你可以马上开始把你的问题分解成几个更小、更容易管理的工作。在这方面你有许多假定的操作。你知道吗

你将搜索,比较,提取和写入磁盘。不幸的是,根据提供的信息,搜索将是解决方案中最低效的部分。你知道吗

你必须分析两组数据。您应该从编写函数来处理这个问题开始,而不是直接解决这个问题。分而治之!你知道吗

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文件,将主机地址写入文件主机_结果.txt. 你知道吗

这是一个相当幼稚的实现。无论如何,它应该让你开始。我不知道你的文件最终会变成多大,但我也建议你寻找生成器,以便在较小的流中逐点读取日志文件,而不是将大量数据集加载到内存中

但很像现有的评论。可以根据对数据的假设进行优化。这是可预测的吗?是否需要转换、格式化等。。。你知道吗

我建议把你的问题稍加修饰,以便更好地了解问题的范围和细节

相关问题 更多 >