2011-09-18 4 views
0

내 파일은 다음과 같습니다 :파이썬 : 구문 분석 텍스트 파일은

(100)에 의해 2의 매트릭스,

나는 각 열의 각 행의 첫 번째 요소에 대응하는 하나 개의 목록을 목록을 만들 싶습니다

전류에 맵핑하고 두 번째 요소는 온도에 맵핑합니다.

아래와 같습니다. 코드를 더 좋아 보이게 만드는 더 좋은 방법은 없을까요?

-12,30 
-34,50 
-33,89 
-900,9 
-2,37 
-7,17 
-8,28 
-12,30 
-34,50 
-33,89 

def parse_log(fname): 
    f = open(fname, "r") 
    samples = f.readlines() 
    samples = filter(lambda x: not x.startswith('*'), samples) 
    print(samples) 
    current = map(lambda x: -1 * int(x.split(',')[0]), samples) 
    print(current) 
    temperature = map(lambda x: int(x.split(',')[1]), samples) 
    print(temperature) 
    return (current, temperature) 
+0

''lambda ''로'map'과'filter'를 사용하지 마십시오. 이해력을 사용하십시오. – JBernardo

답변

0

사용 발전기 표현 :

def parse_log(fname): 
    with open(fname, "r") as file: 
     return zip(*(
      (int(current) * -1, int(temp)) for current, temp in 
       (line.strip().split(',') 
        for line in file if not line.startswith('*')) 
     )) 

print parse_log(filename) 

[(-12, -34, -33, -900, -2, -7, -8, -12, -34, -33), (30, 50, 89, 9, 37, 17, 28, 30, 50, 89)] 

경고가 읽고 무슨 일이 일어나고 있는지 이해하는 것이 아마 더 어렵다,이 반드시 좋은 것은 아닙니다. 문서화 문자열을 사용하여 올바르게 문서화하십시오.

+0

귀하의 대답은 목록 내포물을 사용하지 않습니다. 또한 전류의 음의 값을 수정하지 못했습니다. – agf

+0

죄송합니다, 내 대답은 바뀌었지만 내 텍스트는 바뀌지 않았습니다. 고정 텍스트 : – six8

+0

아, 그는 그의 요구 사항에 넣지 않았고 나는 코드에서 그것을 간과했다. – six8

1

하는 모든 줄을 두 번 split 전화를하고 방지하기 위해, 나는 다음과 같은 솔루션

def parse_log(fname): 
    with open(fname) as f: 
     samples = [line.strip() for line in f.readlines() 
        if not line.startswith('*')] 
     ints = [map(int, line.split(",")) for line in samples] 
     currents = [-x[0] for x in ints] 
     temperatures = [x[1] for x in ints] 
     return currents, temperatures 
1

이 로그 파일의 몇 메가 바이트까지 IMO 합리적인 것 간단한 버전을 건의 할 것 (그것은 아무튼 구문 분석 중에 메모리 사용량이나 계산 시간을 최소화하려고 시도하지 마십시오.) :

def parse_log(fname): 
    data = [map(int, x.split(",")) for x in open(fname) if x[:1] != "*"] 
    return ([-current for current, temp in data], 
      [temp for current, temp in data])