2014-10-21 2 views
0

주 스크립트에서 가져 오려는 모듈에 함수 (read())를 작성했습니다.이 함수는 정규 표현식으로 파일을 읽고 간단히 배열을 만듭니다.파이썬 : 함수 인수로 파일 객체

이 함수가 취하는 유일한 매개 변수는 읽어야하는 파일 (.txt, 숫자 만)입니다. 주체 스크립트 data = open('output99.txt', 'r')에 파일을 열어서 객체 data을 입력 한 다음 파일 객체 data을 함수에 전달하면 원하는 때마다 입력 파일을 변경할 수 있습니다. 문제가 될 수 있습니까? 내가 그렇게 할 경우 는 기능이 작동하고, 하늘의 배열을 반환하지 않기 때문에 : 나는 함수 내부의 파일을 열 경우

def read(data): 

n_lines = sum(1 for line in data) 
array = np.empty((n_lines,13)) 
re_re = re.compile('^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)') 

i=0 
for line in data: 
    reg = re_re.search(line) 
    if(re!=None): 
     array[i,0] = reg.group(1) 
     array[i,1] = reg.group(2) 
     array[i,2] = reg.group(3) 
     array[i,3] = reg.group(4) 
     array[i,4] = reg.group(5) 
     array[i,5] = reg.group(6) 
     array[i,6] = reg.group(7) 
     array[i,7] = reg.group(8) 
     array[i,8] = reg.group(9)  
     array[i,9] = reg.group(10) 
     array[i,10] = reg.group(11) 
     array[i,11] = reg.group(12) 
     array[i,12] = reg.group(13) 

    i+=1 



return array 

이 제대로 작동을하지만, 내가 원하는 때 훨씬 덜 빠른 것 입력 파일을 변경합니다. 아무도 날 설명 할 수 있을까?

답변

1

data은 파일 이름이 아닙니다. 그것은 file 개체입니다. 당신이

sum(1 for line in data) 

를 사용에서 읽을 때 파일 포인터가 파일의 끝에 있도록 당신이 파일의 전체 내용을 읽어 보시기 바랍니다. 당신이

for line in data: 

다시 그것에서 읽으려고 할 때 이미 파일에 모든 것을 읽은 때문에, 데이터를 얻을 수 없습니다. 문제를 해결하려면 줄 수를 계산 한 후 파일 포인터를 다시 설정해야합니다.

data.seek(0) 
+0

감사합니다. 문제가 해결되었습니다. 죄송합니다. 질문에 '파일 이름'을 '파일 객체'로 변경하겠습니다. – Argentina