如何在每列中获取值?

时间:2013-03-27 07:11:51

标签: python

我有一个包含列的文本文件。我想在“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 个答案:

答案 0 :(得分:1)

您的问题未明确,但我可以尝试猜测它。鉴于C列中的“sri lanka”,您不能只分割空格。如果你准确地粘贴它,你就不会使用标签。

因此,每列可以从行中的特定位置开始:列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:]]

事实证明,这两种猜测都不对,因为你的实际文件格式......与你向我们展示的内容完全不同,而是standard IIS log formats之一。您还没有说出哪一个,但假设它是W3C / NCSA / Common格式之一,这与解析任何Web服务器日志完全相同。

有许多Python模块可以做到这一点,包括apachelogpylogsparser,但最好的办法是搜索自己,看看那里有什么。

答案 1 :(得分: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个空白字符”。

答案 2 :(得分: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]

答案 3 :(得分: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列