使用python从文本文件向列添加字段

时间:2017-02-15 04:32:17

标签: python csv itertools

我有一个文本文件,我试图从中提取列和数据。以下是数据样本:

-Global stats enabled 
 Cpu Utilization : 0.1  %  45.4 Gb/core 
 Platform_factor : 1.0  
 Total-Tx        :     270.75 Mbps  
 Total-Rx        :       0.00  bps  
 Total-PPS       :      37.98 Kpps  
 Total-CPS       :       0.00  cps  

 Expected-PPS    :     102.71 Kpps  
 Expected-CPS    :       2.78 Kcps  
 Expected-BPS    :     764.51 Mbps  

 Active-flows    :      366  Clients :      252   Socket-util : 0.0023 %    
 Open-flows      :     2792  Servers :    65534   Socket :      366 Socket/Clients :  1.5 
 drop-rate       :     270.75 Mbps   
 current time    : 7.6 sec  
 test duration   : 3592.4 sec  

-Latency stats enabled 
 Cpu Utilization : 0.0 %  
 if|   tx_ok , rx_ok  , rx check ,error,       latency (usec) ,    Jitter          max window 
   |         ,        ,          ,     ,   average   ,   max  ,    (usec)                     
 ---------------------------------------------------------------------------------------------------------------- 
 0 |     1116,       0,         0,    0,          0  ,       0,       0      |  0  0  0  0  0  0  0  0  0  0  0  0  0 
 1 |     1116,       0,         0,    0,          0  ,       0,       0      |  0  0  0  0  0  0  0  0  0  0  0  0  0 
 2 |     1116,       0,         0,    0,          0  ,       0,       0      |  0  0  0  0  0  0  0  0  0  0  0  0  0 
 3 |     1116,       0,         0,    0,          0  ,       0,       0      |  0  0  0  0  0  0  0  0  0  0  0  0  0 
[2J[2H
-Per port stats table 
      ports |               0 |               1 |               2 |               3 
 -----------------------------------------------------------------------------------------
   opackets |           30391 |           48748 |           30360 |           48696 
     obytes |         2468147 |        68386300 |         2465677 |        68310324 
   ipackets |               0 |               0 |               0 |               0 
     ibytes |               0 |               0 |               0 |               0 
    ierrors |               0 |               0 |               0 |               0 
    oerrors |               0 |               0 |               0 |               0 
      Tx Bw |       4.77 Mbps |     130.69 Mbps |       4.76 Mbps |     130.53 Mbps 

我需要从Total-Tx,drop-rate等条目中创建创建列...然后将每次迭代的值添加到新行中。

目前我可以提取列,但需要帮助将包含相关数据的行添加到csv文件中:

import csv
import itertools

with open('output.txt', 'r') as in_file:
    stripped = (line.strip() for line in in_file)
    lines = (line for line in stripped if line)
    grouped = itertools.izip(*[lines] * 4)
    with open('output_stats.csv', 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('current time', 'drop-rate', 'Total-Tx', 'Total-Rx'))
        writer.writerows(grouped)

1 个答案:

答案 0 :(得分:0)

您是否要在-Global stats enabled部分解析并存储条目?

使用regex可能过度,我建议您使用一些基本字符串split

对于只包含一个冒号:的行(您可以使用str.count),使用split(:)会提供两个项目的列表,左侧为键,右侧为值

对于具有多个冒号的行,您可以先按冒号和空格分割,特别注意%中的Socket-util。它会给出[key1, value1, key2, value2, ...]的列表(可能需要展平列表,请参阅Making a flat list out of list of lists in Python)。

然后您可以将键写为列名及其对应的值。

如果您还想在-Latency stats enabled部分中解析和存储ASCII表,可以尝试使用pandas,请参阅How to create a Pandas DataFrame from String