2012-07-06 5 views
0

제가 일하는 회사에 속한 특정 외부 응용 프로그램을 사용하는 Python 스크립트를 작성하려고합니다. 프로그래밍 및 스크립팅에 관해서는 일반적으로 나 자신을 위해 생각할 수 있지만, 이번에는 정말 잃어버린 것입니다!While 루프가 주 기능을 수행하지 않습니다.

나는 왜 while 루프가 작동하지 않는지 알아낼 수 없습니다. 그것은 나를 돕지 않는 어떤 오류도주지 않습니다. 루프의 중심에있는 코드의 중요한 부분을 건너 뛰고 나서 "카운트"를 증가시키는 것처럼 보입니다. "F에서 2 호선 [수]에 대해 :"

f = open('C:/tmp/tmp1.txt', 'w') #Create a tempory textfile 
f.write("TEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\n") #Put some simple text in there 
f.close() #Close the file 

count = 0 #Insert the line number from the text file you want to begin with (first line starts with 0) 
num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt')) #Get the number of lines from the textfile 

f = open('C:/tmp/tmp2.txt', 'w') #Create a new textfile 
f.close() #Close it 

while (count < num_lines): #Keep the loop within the starting line and total number of lines from the first text file 
    with open('C:/tmp/tmp1.txt', 'r') as f: #Open the first textfile 
     line2 = f.readlines() #Read these lines for later input 
     for line2[count] in f: #For each line from chosen starting line until last line from first text file,... 
      with open('C:/tmp/tmp2.txt', 'a') as g: #...with the second textfile open for appending strings,... 
       g.write("hello\n") #...write 'hello\n' each time while "count" < "num_lines" 
    count = count + 1 #Increment the "count" 

나는 모든 때까지 작동 생각

내가 일하고 있어요 진짜 코드는 좀 더 복잡하고, 응용 프로그램 나는 'ISN을 사용하고 있습니다 t는 공유하기 때문에 코드를 간소화하여 문제를 해결할 수 있습니다.

대체 코드를 찾고 있지 않습니다. 루프가 작동하지 않는 이유를 찾고있어 직접 수정하려고 할 수 있습니다.

모든 답변을 주시면 감사하겠습니다. 미리 감사드립니다.

코맥

+1

f :'에 줄 수 [for]를 사용할 수 있습니까? ''for line in f : '을 해봤습니까? – Wug

+1

허. 문제는'readlines()'호출을 한 후에'f'가 더 이상 읽을 줄이 없다는 것인데,'line2 [count]'에'None'을 넣는다는 것입니다. – cha0site

+1

아마도'line2 [count] in f'와 관련이 있습니다. line2를 만들면'for line2 in'을 사용해야합니다. – purpleladydragons

답변

2

일부 의견 : 대신 당신처럼 떨어지게하고 싶지

num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt')) 

이유는 무엇입니까? len(open(filename, 'rb').readlines())의 문제점은 무엇입니까? 나는 보편적으로 인식되고 색인 i를, 이름

for i in range(num_lines): 
    ... 

참고, 나는 rangefor 루프를 사용하는 것이 :

while (count < num_lines): 
    ... 
    count = count + 1 

이 나쁜 스타일, 당신은 사용할 수 있습니다.

지금 내가 말한 것처럼, f은 파일 (즉, 위치 포인터가있는 바이트 스트림)이며 모든 줄을 읽은 것입니다. 따라서 for line2[count] in f:을 실행하면 line2[count]으로 라인을 읽으려고 시도합니다. (조금 이상합니다. 실제로 인덱스 멤버로리스트 멤버와 함께 for 루프를 사용하지는 않지만 분명히 할 수 있습니다), 라인이 없음을 확인하십시오. 읽고 루프 내부에있는 것을 실행하지 않습니다.

어쨌든 주어진 줄 번호부터 줄 단위로 파일을 읽으려고합니까? 여기에 더 좋은 방법이 있습니다 :

from itertools import islice 

start_line = 0 # change this 
filename = "foobar" # also this 

with open(filename, 'rb') as f: 
    for line in islice(f, start_line, None): 
     print(line) 

대체 코드를 원하지 않지만 실제로 코드는 불필요하게 복잡합니다.

+0

답변 해 주셔서 감사합니다! 내가 대체 코드를 요구하지 않은 이유는 내가 어려운 일을 배워야하기 때문이다. 그렇게하면 혼자서 무언가를 알아 내면 더 잘 이해할 수있을 것이고 영원히 다시 할 수있는 방법을 기억할 것입니다. 그러나 나는 당신이 나에게 하나의 큰 대안보다는 "작은"대안을 제안한 것을 좋아합니다. 그렇게하면 시간을 들여 더 조사 할 수 있습니다. 감사! – FCormacB

+0

'rb'는 바이너리로 파일을 읽습니까? 이것이보다 효율적인 코드를 만들 수 있습니까? – FCormacB

+0

@FCormacB :'b'는 바이너리에서는 짧지 만, FTP의'BINARY'와'ASCII' 명령의 의미에서입니다. 이 파일이 없으면 Windows에서의 Python은 파일을 읽고 쓸 때'\ r \ n'과'\ n' 사이에서 변환됩니다. 보통 내 파일이 암시 적으로 수정되는 것을 좋아하지 않으므로 파일을 열 때'b'를 사용합니다. 짧은 버전 - 효율성을 위해 아무 것도하지 않지만 바이너리 파일 (JPEG, MP3 등)의 경우 정확성이 중요합니다. – cha0site

0

당신이 파일 (F)의 라인을 반복 할 경우, 내가 사용하기 때문에, 당신은 2 호선라는 배열에 라인을 넣어

for line in line2: 
    # do something with "line"... 

으로 라인 "에 대한"대체 제안 그 배열! line2 [count]를 루프 변수로 사용하는 것은 나에게 의미가 없다.

+0

확인. 감사! 위의 코드를 변경했는데 이제는 그 코드가 의도 한대로 작동한다고 생각합니다. 이제 실제 코드를 수정할 수 있는지 확인해야합니다. 모두에게 다시 한 번 감사드립니다! – FCormacB

0

'for line in f'루프가 어떻게 작동하는지 잘못 판단하는 것 같습니다. 읽을 줄이 없을 때까지 파일을 반복하고 readline을 호출합니다. 그러나 루프를 시작하는 순간 모든 행은 이미 읽혀지고 (f.readlines()를 통해) 파일의 현재 위치는 끝에 있습니다. f.seek (0)를 호출하여 원하는 것을 얻을 수는 있지만 어쨌든 좋은 결정이 아닌 것 같습니다. 파일을 다시 읽으려고하면 IO가 느려지니까요.

for line in line2[count:]: # iterate over lines read, starting with `count` line 
    do_smth_with(line) 
+0

흥미 롭습니다. 내가 생각하기에 나는 주변에 간섭 할 것이다. – FCormacB

관련 문제