我有一个包含列的文本文件。我想在“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
答案 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模块可以做到这一点,包括apachelog
和pylogsparser
,但最好的办法是搜索自己,看看那里有什么。
答案 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列