Python, проверка файла данных на определенные строки - PullRequest
0 голосов
/ 04 февраля 2011

Я никогда не брал класс, который использовал python, просто c, c ++, c #, java и т. Д. Это должно быть легко, но я чувствую, что мне не хватает чего-то огромного, на что реагирует питон. Все, что я делаю - это читаю в файле, проверяю строки, состоящие только из цифр, подсчитываю, сколько таких строк, и показываю их.

Итак, я открываю, читаю, чередую, проверяю 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"

Ответы [ 5 ]

4 голосов
/ 04 февраля 2011

В Python правильно определить, достигли ли вы конца файла, это , а не , чтобы проверить, возвращает ли он пустую строку.

Вместо этого переберите все строки в файле, и цикл будет завершен, когда будет достигнут конец файла.

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

Поскольку файлы можно перебирать, вы можете упростить это, используя выражение генератора:

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

Я бы также рекомендовал не использовать зарезервированные ключевые слова Python, такие как sum, в качестве имен переменных, а также очень неэффективно использовать сравнения строк для логики потока, как вы делаете.

2 голосов
/ 04 февраля 2011
sum=0
f=open("file")
for line in f:
    if line.strip().isdigit():
         sum+=1
f.close()  
0 голосов
/ 04 февраля 2011

Как уже говорили несколько человек, ваш код работает отлично.Возможно, ваш файл «data.txt» находится в другом каталоге, чем ваш текущий рабочий каталог (не обязательно каталог, в котором находится ваш скрипт)?

Однако, вот более «питонный» способ сделать то же самое:

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)

Вы даже можете сделать его однострочным с:

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

Сначала я бы избежал этого маршрута ... Он гораздо менее читабелен!

0 голосов
/ 04 февраля 2011

Я только что попытался запустить ваш код:

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

Здесь все отлично работает. Что находится в вашем data.txt?

0 голосов
/ 04 февраля 2011

Как у вас работает программа? Вы уверены, что 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) )
...