2010-04-20 3 views
1

웹에서 텍스트 파일을 읽는 중입니다. 파일은 데이터 포인트 수를 포함하는 일부 헤더 행으로 시작하고 실제 꼭짓점 (각각 3 개의 좌표)을 따릅니다. 내가 읽고 내가 얼마나파이썬에서 파일에서 특정 수의 float을 읽는 방법?

이것은

# comment 
HEADER TEXT 
POINTS 6 float 
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 
POLYGONS 

단어 POINTS로 시작하는 라인은 정점의 수를 포함 (우리가 줄에 세 꼭지점이이 경우에는, 그러나 그것은 변경 될 수 있습니다) : 같은 파일이 보인다 지금 당장 :

ur=urlopen("http://.../file.dat") 

j=0 
contents = [] 
while 1: 
    line = ur.readline() 
    if not line: 
     break 
    else: 
     line=line.lower()  

    if 'points' in line : 
     myline=line.strip() 
     word=myline.split() 
     node_number=int(word[1]) 
     node_type=word[2] 

     while 'polygons' not in line : 
      line = ur.readline() 
      line=line.lower() 
      myline=line.split() 

      i=0 
      while(i<len(myline)):      
       contents[j]=float(myline[i]) 
       i=i+1 
       j=j+1 

줄 단위로 문자열을 읽고 부동 소수점 숫자로 변환하는 대신 지정된 수의 부동 소수점을 읽을 수있는 방법은 무엇입니까? 대신 내가 파일

어떤 제안을 환영합니다에서 지정된 수의 요소를 읽을 수 ur.readline()의

..

+1

줄을 읽는 대신 특정 수의 수레 만 읽어야한다고 생각하는 이유를 설명해 주시겠습니까? 그 대답은 우리가 당신을 도울 때 도움이 될 것입니다 ... (예를 들어, 행을 읽고, 공간을 나누고, 필요한 수의 요소를 반환하고, 즉시 플로트로 변환 할 수 있습니까?) –

+0

문제는 파일이 크고 요소의 실제 수가 100000에 가까우며 이렇게하면 너무 많은 시간이 걸립니다. – sahel

+0

@sahel, (docs.python.org/library/profile.html) 프로파일을 작성하고 병목 현상은? 결과와 관련 코드를 게시 할 수 있습니까? (이러한 것들이 있다면, 조금 도움이 될만한 아이디어를 생각해 볼 수 있습니다.) 해석 할 형식에 대해 더 자세히 설명해 주시겠습니까? 아마도 파일을 처리하는 더 좋은 방법이 있을까요? –

답변

3

나는 당신의 목표는 당신의 설명에서 무엇 완전히 확실하지 않다 .

레코드의 경우, 기본적으로 내가 선택한 것과 동일한 기술을 사용하려는 것으로 보이는 코드가 있습니다. contents[j] = ...IndexError이 될 것이기 때문에 루프 및 색인을 사용하고 실제로 코드가 작동하지 않는다면 문제가있는 것입니다.

lines = (line.strip().lower() for line in your_web_page) 

points_line = next(line for line in lines if 'points' in line) 
_, node_number, node_type = points_line.split() 
node_number = int(node_number) 

def get_contents(lines): 
    for line in lines: 
     if 'polygons' in line: 
      break 

     for number in line.split(): 
      yield float(number) 

contents = list(get_contents(lines)) 

당신이하고 싶은 새로운 것에 대해 더 분명히한다면, 아마도 누군가가 당신의 궁극적 인 목표에 대해 더 나은 대답을 제공 할 수 있습니다.

0

여기에 내용을 훨씬 빠르게 반복 할 수 있도록 코드를 정리할 필요가 없습니다.

ur=urlopen("http://.../file.dat") 
contents = [] 
node_number = 0 
node_type = None 
while 1: 
    line = ur.readline() 
    if not line: 
     break 
    line = line.lower()  
    if 'points' in line : 
     word = line.split() 
     node_number = int(word[1]) 
     node_type = word[2] 
     while 1: 
      pieces = ur.readline().split() 
      if not pieces: continue # or break or issue error message 
      if pieces[0].lower() == 'polygons': break 
      contents.extend(map(float, pieces)) 
assert len(contents) == node_number * 3 

당신이 함수의 코드를 포장하고 전화를하는 경우가 더 빨리 (대신 세계 사람들의 지역 변수에 접근 할 수 있기 때문에)를 실행합니다.

가장 중요한 변경 사항은 스크립트의 끝 부분/끝 부분입니다.

그러나 몇 초 동안 생각해보십시오. 얼마나 많은 시간이 ur.readline()에 의해 처리되고 줄을 풀어서 얼마입니까?

+0

@John Machin, 서있는 자세로 생각하고 그것에 대해 생각하는 것이 좋지만 아직까지는 충분히 서 있지는 않을 것입니다. –

관련 문제