2015-01-12 5 views
0

일부 입력을 처리하는 데 문제가 있습니다. 로그 파일에서 데이터를 읽고 이름에 따라 다른 값을 저장하고 있습니다. 그래서 내 입력 문자열은 ip, 이름, 시간 및 데이터 값으로 구성됩니다. 로그 라인은 다음과 같습니다 그것은 \의 t 간격이 있습니다목록으로 데이터 문자열을 변환

134.51.239.54 Steven 2015-01-01 06:09:01 5423 

이 코드를 사용하여 값을 읽고 있어요 : 이것은 아주 잘 작동

loglines = file.splitlines() 
    data_fields = loglines[0] # IP NAME DATE DATA 
    for loglines in loglines[1:]: 
    items = loglines.split("\t") 
    ip = items[0] 
    name = items[1] 
    date = items[2] 
    data = items[3] 

을하지만 난 모든 이름을 추출해야 목록에 있지만 기능적 해결책을 찾지 못했습니다. 내가 인쇄 이름을 사용하는 경우

내가 얻을 :

Steven 
Max 
Paul 

나는이 같은 이름의 목록을해야합니까 :

['Steven', 'Max', 'Paul',...] 

이 간단한 해결책은 아마 내가 그것을 생각하지 않은 아직,하지만 아무도 도울 수 있습니까?

감사합니다.

답변

0

그냥 빈 목록을 만들고 파일을 반복하면서 이름을 추가하십시오.

또한 해당 파일이 매우 큰 경우 메모리에 전체 파일을 읽을 때, file.splitlines()가 아마 가장 좋은 생각이 아니다 있습니다 - 그리고 당신은 기본적으로 loglines[1:]을 수행하여 그 모든를 복사합니다. file 개체 자체를 반복자로 사용하는 것이 더 좋습니다. 변수 이름으로 file을 사용하지 마십시오. 유형을 음영 처리합니다.

with open("some_file.log") as the_file: 
    data_fields = next(the_file)  # consumes first line 
    all_the_names = []    # this will hold the names 
    for line in the_file:   # loops over the rest 
     items = line.split("\t") 
     ip, name, date, data = items # you can put all this in one line 
     all_the_names.append(name) # add the name to the list of names 

다른 방법으로는 (loglines 데이터를 사용하여) 하나 개의 표현에 모두 넣어 zipmap를 사용할 수 있지만, 오히려 그렇게 안 ... zip(*map(lambda s: s.split('\t'), loglines[1:]))[1]

+0

감사 답장을하지만, 내가 당신의 코드를 사용할 때 나는 모든 라인 "None"을 얻는다. 편집 : 내 나쁜, 작동한다. – jack11

관련 문제