-3

我有一个带有列的文本文件。我想提取列“C”中的数据

   A           B               C
  2013      colombo         sri lanka    
  2012      Tokyo           Japan

下面是我用来查找数据的代码。

f = open('log.txt','r')
data = f.read()
import re

#print data

def find(pat,text):
        match = re.search(pat,text)
        if match: print match.group()
        else: print 'not found!'

x = re.findall(r'\w+:',data)
print x
4

4 回答 4

1

您的格式确实未指定 - 很难找到一个好的规则,其中一列结束而另一列开始。如果您有一些未对齐的行,则可能无法明确确定数据与列的对应方式。

因此,您将需要一些启发式方法。一种有前途的方法是考虑由至少 3 个空白字符分隔的列

>>> print data
   A           B               C
  2013      colombo         sri lanka
  2012      Tokyo           Japan

>>> re.compile('\s{3,}').split(line.strip()) for line in data.splitlines()]
[['A', 'B', 'C'],
 ['2013', 'colombo', 'sri lanka'],
 ['2012', 'Tokyo', 'Japan']]

正则表达式的\s{3,}意思是“至少 3 个空白字符”。

于 2013-03-27T07:50:29.393 回答
1

您的问题未详细说明,但我可以尝试猜测一下。鉴于 C 列中的“斯里兰卡”,您不能只在空格上进行拆分。如果你准确地粘贴了它,你就没有使用标签。

因此,每列都可以从行中的特定位置开始:A 列是 [3:12],B 列是 [12:28],C 列是 [28:]。在这种情况下:

[line[29:] for line in data.splitlines()[1:]]

另一种可能性是您希望在超过 1 个空格的任何运行上进行拆分,而不仅仅是在空格上。在这种情况下:

[filter(None, line.split('  '))[2] for line in data.splitlines()[1:]]

事实证明,这些猜测都不是正确的,因为您的实际文件格式……与您向我们展示的完全不同,而是一种标准的 IIS 日志格式。您还没有说是哪一种,但假设它是 W3C/NCSA/Common 格式之一,这与解析任何 Web 服务器日志完全相同。

有多个 Python 模块可以做到这一点,包括apachelogand pylogsparser,但最好的办法可能是自己搜索,看看有什么。

于 2013-03-27T07:35:17.167 回答
0
with open('file.txt') as filehandler:
    for line in filehandler:
        print line.split(maxsplit=2)[2]

.split("\t")如果字段用制表符分隔,则使用

除了Kos答案,您还可以按正则表达式拆分。您可以尝试按最多一个空格分隔的单词进行拆分:

with open('file.txt') as filehandler:
    for line in filehandler:
        groups = re.compile(r'((?:\w+\s?)+)').split(line)
        print groups[1], groups[3], groups[5]
于 2013-03-27T07:32:10.920 回答
0

假设 B 列永远不会超过一个单词:

# This reads each line, removes the trailing newline, then splits on whitespace
data = [line.strip().split() for line in open('log.txt')]

# The columns
A = []
B = []
C = []
for line in data:
    A.append(line[0])
    B.append(line[1])
    # ' '.join(list) will return a string of the list separated by whitespace
    C.append(' '.join(line[2:]))

print C

C应仅包含 C 列

于 2013-03-27T07:35:51.553 回答