【问题标题】:Parsing log files and write to csv (different number of fields)解析日志文件并写入 csv(不同数量的字段)
【发布时间】:2025-12-27 10:15:11
【问题描述】:

这是一个困扰我很久的问题。我有要转换为 csv 的日志文件。我的问题是日志文件中省略了空字段。我想最终得到一个包含所有字段的 csv 文件。

现在我正在解析日志文件并将它们写入 xml,因为 Microsoft Excel 的一个不错的功能是,当您打开具有不同数量元素的 xml 文件时,Excel 会将所有元素显示为单独的列。

上周我想出了用 Pandas 可以做到这一点的想法,但我找不到一个很好的例子来完成这个。

有人知道如何完成这项工作吗?

更新
我不能在这里分享实际的日志。下面是一个虚构的样本:

样本 1:

First : John Last : Doe Address : Main Street Email : j_doe@notvalid.gov Sex : male State : TX City : San Antonio Country : US Phone : 210-354-4030
First : Carolyn Last : Wysong Address : 1496  Hewes Avenue Sex : female State : TX City : KEMPNER Country : US Phone : 832-600-8133 Bank_Account : 0123456789

正则表达式:

matches = re.findall(r'(\w+) : (.*?) ', line, re.IGNORECASE)

示例 2:

:1: John  :2: Doe :3: Main Street :4: j_doe@notvalid.gov :5: male :6: TX :7: San Antonio :8: US :9: 210-354-4030
:1: Carolyn :2: Wysong :3: 1496  Hewes Avenue :5: female :6: TX :7: KEMPNER :8: US :9: 832-600-8133 :10: 0123456789

正则表达式:

matches = re.findall(r':(\d+): (.*?) ', line, re.IGNORECASE)

【问题讨论】:

  • 一般取决于文件的格式,是否可以创建示例数据?
  • I know the desired column name. - 如果正则表达式解析,是否可以像{'First Name':Joe, 'Last Name':Doe, 'Address':'Main Street', ...} 这样为每一行创建字典?还是不行?
  • 如果是,则创建 dicts 列表并传递给 DataFrame 构造函数,它工作得很好 - 为缺少的列添加了 NaN
  • 可以在每一行都这样做(一些日志是大文件)。现在我将每个字段直接作为元素写入 xml 文件。
  • 列表和/或大文件的 DataFram 没有内存问题?

标签: python pandas csv export-to-csv


【解决方案1】:

请允许我专注于您的第一个示例。您的正则表达式仅匹配每个字段的第一个单词,但现在让我们保持这种状态,因为我相信您可以轻松修复它。

您可以创建一个 pandas DataFrame 来存储您解析的数据,然后对于您运行正则表达式的每一行,将其转换为字典并将其加载到 pandas Series。然后你将它附加到你的数据框。 Pandas 足够聪明,可以用NaN 填充缺失的数据。

df = pd.DataFrame() 
for l in lines: 
    matches = re.findall(r'(\w+) : (.*?) ', l, re.IGNORECASE) 
    s = pd.Series(dict(matches)) 
    df = df.append(s, ignore_index=True)

>>> print(df)
  Address     City Country               Email    First    Last     Sex State         Phone
0    Main      San      US  j_doe@notvalid.gov     John     Doe    male    TX           NaN
1    1496  KEMPNER      US                 NaN  Carolyn  Wysong  female    TX  832-600-8133

我不确定是否需要 dict 步骤,也许有一种 pandas 方法可以直接解析您的元组列表。

然后您可以轻松地将其转换为 csv,您将在适当的地方保留所有带有空字段的列。

df.to_csv("result.csv", index=False) 

>>> !cat result.csv                                                                                                                                                              
Address,City,Country,Email,First,Last,Sex,State,Phone
Main,San,US,j_doe@notvalid.gov,John,Doe,male,TX,
1496,KEMPNER,US,,Carolyn,Wysong,female,TX,832-600-8133

关于大文件的性能,如果您事先知道所有字段名称,则可以使用 columns 参数初始化数据帧,然后运行解析和 csv,同时保存一个块。 IIRC 有一个 mode 参数 to_csv 应该允许您附加到现有文件。

【讨论】: