2013-03-27 38 views
-3

我有一個文本文件的列。我想提取「C」列中的數據如何獲取每列中的值?

A   B    C 
    2013  colombo   sri lanka  
    2012  Tokyo   Japan 

flolowing是我用來查找數據的代碼。

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 
+1

你必須使用Python嗎?這對於s​​hell實用程序來說是微不足道的。 – squiguy 2013-03-27 07:13:51

+0

是的,我想用python來做到這一點? – 2013-03-27 07:17:05

+1

我很困惑...正在使用「find」函數在哪裏?另外,你能否對屬於A,B和C列的內容更具體? – SethMMorton 2013-03-27 07:18:21

回答

0
with open('file.txt') as filehandler: 
    for line in filehandler: 
     print line.split(maxsplit=2)[2] 

使用.split("\t")如果字段與標籤

分離此外,以科斯的回答,您可以通過正則表達式拆分。您可以嘗試用至多一個空格分隔的單詞進行分割:

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] 
+0

這與Thai Tran的答案完全一樣,並且具有完全相同的問題。 – abarnert 2013-03-27 07:32:28

+0

maxsplit解決它。另外,如果文件是用tab分隔的,那麼你使用'.split(「\ t」)'並且你不會遇到這個問題 – 2013-03-27 07:33:41

+0

maxsplit'解決了這個問題,但是2009年的里約熱內盧里約熱內盧「?至於'\ t'-,可能是他複製並粘貼錯誤,但是否則,沒有選項卡。 – abarnert 2013-03-27 07:36:41

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:]] 

事實證明,無論這些猜測是正確的,因爲你實際的文件格式是...什麼像什麼,你給我們,而是standard IIS log formats之一。你還沒有說過哪一個,但假設它是W3C/NCSA/Common格式之一,這與解析任何Web服務器日誌完全相同。

有多個Python模塊可以做到這一點,其中包括apachelogpylogsparser,但最好的辦法可能是搜索自己並查看其中的內容。

+0

其實我想得到什麼在IIS服務器日誌文件中的「refer」字段?由於機密性,我不能發佈內容? #字段:日期時間s-sitename s-ip cs-method cs -uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent)cs(Referer)sc-status sc-substatus sc -win32-status – 2013-03-27 08:14:13

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

+0

看來第一行將只是'「lanka」'。 – bereal 2013-03-27 07:37:42

+0

我懷疑這是一個很好的假設,因爲B列顯然是首都城市或最大的城市,而且其中很多都有不止一個詞。 – abarnert 2013-03-27 07:38:12

+0

@bereal如果sri在元素2中,並且lanka在元素3中,則行[2:]應該返回元素2和3,所以''.join(行[2:])將包含sri和lanka。 – SethMMorton 2013-03-27 07:39:52

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個空白字符」。

+0

其實我想要的是讀取一個IIS服務器日誌文件,並得到什麼在「參考」字段?由於保密我不能發佈的內容? – 2013-03-27 08:13:22

+0

你爲什麼選擇由至少3個空白字符而不是兩個分隔? – martineau 2013-03-27 08:14:31

+0

@martineau沒有理由。:-)只是提出一個啓發式的想法,OP應該調整它以適合他的實際輸入最好 – Kos 2013-03-27 08:15:21