2013-03-27 10 views
-3

나는 열이있는 텍스트 파일을 가지고 있습니다. 나는각 열의 값을 가져 오는 방법은 무엇입니까?

A   B    C 
    2013  colombo   sri lanka  
    2012  Tokyo   Japan 

flolowing 내가 데이터를 찾을하는 데 사용되는 코드 열 "C"에서 데이터를 추출하고 싶습니다. 필드는 또한 코스 대답 탭으로

로 구분하는 경우

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

파이썬을 사용해야합니까? 이것은 쉘 유틸리티를 사용하면 간단합니다. – squiguy

+0

예 파이썬으로 이것을하고 싶습니까? –

+1

혼란스러워 ... "찾기"기능은 어디에 사용됩니까? 또한 열 A, B 및 C에 속하는 항목에 대해 더 구체적으로 설명 할 수 있습니까? – SethMMorton

답변

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

+0

maxsplit이 해결합니다. 또한 파일이 탭으로 분리되어 있다면,'.split ("\ t")'을 사용하면 그 문제는 발생하지 않을 것입니다. –

+0

'maxsplit'는이 특별한 경우를 해결 합니다만, "2009 Rio De 브라질 자네이로 "? '\ t' 잘, 그는 복사하고 잘못 붙인 가능성이 있지만, 그렇지 않으면 탭이 없습니다. – abarnert

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/일반 형식 중 하나라고 가정하면 이는 웹 서버 로그를 구문 분석하는 것과 정확히 같습니다.

apachelogpylogsparser을 포함하여 여러 가지 파이썬 모듈이 있지만, 할 수있는 최선의 방법은 자신을 검색하여 그곳을 확인하는 것입니다.

+0

사실 저는 IIS 서버 로그 파일의 "refer"필드 아래에서 무엇을 얻고 싶습니까? 기밀성으로 인해 내용을 게시 할 수 없습니까? (사용자 - 에이전트) cs (참조 자) sc - status sc - substatus sc - 상태 sc - 상태 sc - 상태 sc - 상태 sc -win32-status –

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

+0

B 열은 분명히 대도시 또는 대도시 중 하나이며 많은 대다수가 하나의 단어를 가지고 있기 때문에 좋은 가정이라고 생각하지 않습니다. – abarnert

+0

@bereal sri가 요소 2에 있고 lanka가 요소 3에 있으면 줄 [2 :]는 요소 2와 3을 반환해야하므로 ''.join (line [2 :])에는 sri와 lanka가 모두 포함됩니다. – SethMMorton

1

귀하의 형식은 정말 underspecified입니다 - 그것은 좋은 규칙을 구하기 힘든 어디 하나 열 종료 다른 하나가 시작됩니다. 정렬되지 않은 행이있는 경우 데이터가 열과 일치하는 방식을 모호하게 결정할 수 없습니다.

따라서 경험적 연구가 필요합니다.

>>> 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 공백 문자"를 의미 정규 표현식 : 유망한 접근 방식은 적어도 3 개 공백 문자로 구분 열을 고려하는 것입니다.

+0

사실 내가 원했던 것은 IIS 서버 로그 파일을 읽고 "참조"필드 아래에서 무엇을 얻었습니까? 기밀성으로 인해 콘텐츠를 게시 할 수 없습니까? –

+0

왜 두 개가 아닌 적어도 3 개의 공백 문자로 구분을 선택하셨습니까? – martineau

+0

@martineau 이유가 없습니다.:-) 휴리스틱에 대한 아이디어를 제시하는 것만으로도 OP는 실제 입력에 맞게 조정해야합니다 – Kos

관련 문제