将文本转换为列

2024-06-09 08:26:12 发布

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

我有一个格式奇怪的文本文件,你可以看到头和列不包含一个单独的列,但列可能包含一些空格。你知道吗

原始文件示例:

    Src IP addr  Port    Dest IP addr  Port       SSRC          Payload  Pkts         Lost   Max Delta(ms)  Max Jitter(ms) Mean Jitter(ms) Problems?
  1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X

将此文本转换为数组的最有效方法是:

['1.2.3.4','17622','5.6.7.8','15932','0xEE531C47','ITU-T G.711 PCMU','60962','2 (0.0%)','106.78','8.55','0.34','X']
  • 列1-5是1到1。你知道吗
  • 第6列可能包含3个标记。你知道吗
  • 第7列是1比1
  • 第8列包含2个标记。你知道吗
  • 第9-12列为1对1。你知道吗

Tags: 文件标记ipsrc示例port格式max
3条回答

将字符串拆分,并按您所需的方式将列表拆分。可能有一个正则表达式解决方案,但这个很简单。从1到5计算列数,然后根据列数决定第6列,然后向后计算其他列。你知道吗

>>> data = '  1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X'
>>> values = data.split()
>>> offset = len(values)-7
>>> values[:5] + [' '.join(values[5:offset])] + [values[-7]] + [values[-6] +' '+ values[-5]] + values[-4:]
['1.2.3.4', '17622', '5.6.7.8', '15932', '0xEE531C47', 'ITU-T G.711 PCMU', '60962', '2 (0.0%)', '106.78', '8.55', '0.34', 'X']

这可能比regex解决方案更有效,但是regex可以做得更好。你知道吗

line = '1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X'

parts = line.split()
# Make it readable
maxtokens = 15
numcols = 12
col6 = 5

# Get number of tokens for column 6
idx = col6 + len(parts) - maxtokens + 3

# Build the list
a = [p for p in parts[:col6]]           # Cols 1-5
a.append(' '.join(parts[col6:idx]))     # Col 6
a.extend(parts[idx:idx+1])              # Col 7
a.append(' '.join(parts[idx+1:idx+3]))  # Col 8
a.extend([p for p in parts[idx+3:]])    # Cols 9-12
print(a)

输出:

['1.2.3.4', '17622', '5.6.7.8', '15932', '0xEE531C47', 'ITU-T G.711 PCMU', '60962', '2 (0.0%)', '106.78', '8.55', '0.34', 'X']

这个正则表达式非常脆弱,但下面是:

>>> import re
>>> line = "1.2.3.4 17622  5.6.7.8 15932 0xEE531C47 ITU-T G.711 PCMU 60962     2 (0.0%)          106.78            8.55            0.34 X"
>>> regex = re.compile(r'^([\d{1,3]\.[\d{1,3]\.[\d{1,3]\.[\d{1,3])\s+(\d+)\s+([\d{1,3]\.[\d{1,3]\.[\d{1,3]\.[\d{1,3])\s+(\d+)\s+(\w+)\s+(.*)\s+(\d+)\s+(\d+\s+\(\d+\.\d+%\))\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\w+)$')
>>> matches = regex.match(line)
>>> list(matches.groups())
['1.2.3.4', '17622', '5.6.7.8', '15932', '0xEE531C47', 'ITU-T G.711 PCMU', '60962', '2 (0.0%)', '106.78', '8.55', '0.34', 'X']

相关问题 更多 >