使用 Python Pandas 比较常见条目的动态文件

Comparing dynamic files for common entries using Python Pandas

我有 N 个 .txt 文件,每个文件在一个目录中有数千个 IP 地址(例如 /var/logs)。文件名以 'log' 开头,例如 log01.test.co.net、log02.hello.co.net、log01.domain.co.net 等。我需要将每个 .txt 文件中的 IP 作为一列添加到excel 文件并比较所有列以找到共同的 IP。然后将公共 IP 打印为另一个名为“公共 IP”的列。

如何使用 Python Pandas 库实现要求?有人可以帮忙吗?

我是 Python 的新手,并且能够从网上找到我们可以使用 Python Pandas 库将 txt 文件转换为 excel 格式。

#!/usr/bin/env python3

import pandas as pd

df = pd.read_table('log01.txt')

df.to_excel('output.xlsx', 'Sheet2')

使用pathlib获取所有日志文件并使用pd.read_csv加载它们。使用 value_counts 提取常用 IP 地址,然后将它们添加到 common_ips 列:

import pandas as pd
import pathlib

# Parse all log files
data = {}
for logfile in pathlib.Path('/var/logs').glob('log*'):
    df = pd.read_csv(logfile, squeeze=True).drop_duplicates() \
           .sort_values().reset_index(drop=True)
    data[logfile.name] = df

# Merge all data from logs
df = pd.concat(data)

# Find common IP addresses through all files
common_ips = df.value_counts().eq(df.index.levels[0].nunique()) \
               .loc[lambda x: x].index.to_frame(index=False, name='common_ips')

# Create final dataframe and export it to Excel
df = df.unstack(level=0).join(common_ips)
df.to_excel('report.xlsx', index=False)

示例输出:

    log02.hello.co.net log01.domain.co.net log01.test.co.net     common_ips
0        1.114.104.134       1.156.243.176      1.131.142.79  99.19.144.176
1        1.124.207.151       1.243.206.110     1.207.189.107            NaN
2          1.13.108.19        1.62.221.173     1.249.176.100            NaN
3          1.147.63.14          1.63.85.25        1.252.71.6            NaN
4         1.90.129.211        1.147.154.71      1.27.141.156            NaN
..                 ...                 ...               ...            ...
957      98.162.171.47                 NaN               NaN            NaN
958      99.19.144.176                 NaN               NaN            NaN
959       99.20.58.108                 NaN               NaN            NaN
960      99.220.179.58                 NaN               NaN            NaN
961       99.97.17.252                 NaN               NaN            NaN

[962 rows x 4 columns]