2011-02-04 3 views
0

파이썬, c, C++, C#, java 등의 클래스를 사용하지 않았습니다. 이것은 쉬워야하지만 뭔가를 놓친 것 같습니다. 그 거대한 파이썬 반응합니다. 내가하고있는 일은 파일을 읽는 것, 숫자 만있는 줄을 확인하는 것, 줄 수를 세고 표시하는 것입니다.Python에서 특정 줄에 대한 데이터 파일을 확인했습니다.

그래서 저는 isdigit()을 읽고, 스트라이핑하고, 증가시키고 있습니다. 뭐가 문제 야?

# variables 
sum = 0 
switch = "run" 

print("Reading data.txt and counting...") 

# open the file 
file = open('data.txt', 'r') 

# run through file, stripping lines and checking for numerics, incrementing sum when neeeded 
while (switch == "run"): 
    line = file.readline() 
    line = line.strip() 

    if (line.isdigit()): 
     sum += 1 

    if (line == ""): 
     print("End of file\ndata.txt contains %s lines of digits" %(sum)) 
     switch = "stop" 
+0

글쎄, 하나 들어, 귀하의 들여 쓰기가 깨진 것 같아요 아마 그저 서식 때문입니다. 어떤 종류의 오류가 있습니까? 그리고 그런데, 무언가에 수업을 들지 않은 것은이 세상에서 아무 것도 의미하지 않습니다. –

+0

들여 쓰기는 여기에 나온 것입니다. 이 코드를 사용하면 합계가 0으로 인쇄됩니다. 어쨌든, 전에 파이썬을 배운 적이 없습니까? –

+0

이것이 문제인지는 모르지만 위의 코드는 공백 행에 도달하면 중지됩니다. – senderle

답변

4

파이썬에서 파일 끝에 도달했는지 여부를 알리는 올바른 방법은 이 아니며이 아니 어서 빈 줄을 반환하는지 확인하는 것입니다.

대신 파일의 모든 행을 반복하면 파일 끝에 도달하면 루프가 종료됩니다. 파일이 이상 반복 할 수

num_digits = 0 
with open("data.txt") as f: 
    for line in f: 
     if line.strip().isdigit(): 
      num_digits += 1 

때문에 발전기 표현하여이를 단순화 할 수 있습니다 : 나는 또한 변수 이름과 같은 sum 예약 파이썬 키워드에 대해 추천 할 것입니다

with open("data.txt") as f: 
    num_digits = sum(1 for line in f if line.strip().isdigit()) 

를, 그리고 몹시이기도합니다 당신이하는 것처럼 흐름 논리에 대한 문자열 비교를 사용하는 것은 비효율적입니다.

2
sum=0 
f=open("file") 
for line in f: 
    if line.strip().isdigit(): 
     sum+=1 
f.close() 
+0

왜 OP 프로그램이 작동하지 않습니까? – chrisaycock

+0

빈 줄이 파일의 중간에있을 때 OP 프로그램이 실패 함 –

0

어떻게 프로그램을 실행하는? data.txt에 데이터가 있습니까? 파일에 빈 줄이 있습니까?

이 시도 :

while 1: 
    line = file.readline() 
    if not line: break 
    line = line.strip() 

    if (line.isdigit()): 
     sum += 1 


print("End of file\ndata.txt contains %s lines of digits" %(sum)) 
+0

대괄호는 if 문에 필요하지 않습니다. – kurumi

+0

사실이지만 OP에서 복사하고 붙여 넣기 만합니다. –

0

난 그냥 코드를 실행하려고 : 그것은 여기 잘 작동

[email protected]:~/tmp$ cat data.txt 
1 
a 
542 
dfd 
b 
42 
[email protected]:~/tmp$ python johnredyns.py 
Reading data.txt and counting... 
End of file 
data.txt contains 3 lines of digits 

. data.txt에는 무엇이 있습니까?

+0

공백 문자 앞에 파일을 시도 했습니까? 종료? – senderle

+0

senderle : 끝의 공백은 차이를 만들지 않아야하지만, OP의 if 문과 마찬가지로 중간의 공백은 올바르게 줄 앞의 숫자 만 계산합니다. –

+0

OP의 의도는 의심 스럽네요. 이 경우, 출력 행은'\ ndata.txt가 공백의 첫번째 줄 앞에 % s 개의 줄을 포함하고 있음 '을 읽어야합니다. – senderle

0

여러 사람들이 말했듯이 코드가 완벽하게 작동하는 것처럼 보입니다. 아마도 "data.txt"파일이 현재 작업 디렉토리가 아닌 다른 디렉토리에 있습니다 (반드시 스크립트가있는 디렉토리 일 필요는없는)?

counter = sum([line.strip().isdigit() for line in open('data.txt', 'r')]) 

내가 그 길을 피할 것 :

counter = 0 
with open('data.txt', 'r') as infile: 
    for line in infile: 
     if line.strip().isdigit(): 
      counter += 1 
print 'There are a total of {0} lines that start with digits'.format(counter) 

당신도 함께 그것을 한 줄을 만들 수 :

그러나, 여기에 같은 일을하고 더 "파이썬"방법이있다 처음에는 ... 그것은 훨씬 덜 읽기 쉽습니다!

+0

간단히 말하자면, 문제는 숫자로만 구성되는 줄 수를 세는 것이 었습니다. 하나부터 시작하십시오. 코드에서 [0]을 제거하는 것만으로도 문제가됩니다. –

+0

@squiddy Woops, 맞아! 내가 잘못 읽었 어, 고마워! 어떤 이유로 나는 "숫자로 시작하는 줄"이라는 질문을 읽었습니다 ... (메모를 다시 게시하기 전에 나는 그것을 실수로 삭제했습니다 ...) –

관련 문제