2014-01-17 2 views
1

Предположим, у меня есть программа, которая использует .txt-файл для хранения данных, которые ему нужны для работы. Поскольку в текстовом файле очень много данных (просто с ним), я должен был использовать генератор, а не итератор, чтобы просматривать данные в нем, чтобы моя программа оставляла как можно больше места. Давайте просто скажем (я знаю, что это не безопасно), что это список имен пользователей. Таким образом, мой код будет выглядеть так (используя python 3.3).Получение количества строк в текстовом файле без ссылок на чтение

for x in range LenOfFile: 
    id = file.readlines(x) 
    if username == id: 
     validusername = True 
     #ask for a password 
if validusername == True and validpassword == True: 
    pass 
else: 
    print("Invalid Username") 

Предположим, что для действующего пароля установлено значение Истина или False, где я запрашиваю пароль. Мой вопрос в том, что, поскольку я не хочу использовать всю оперативную память, я не хочу использовать readlines(), чтобы получить все это, и с кодом здесь я беру только очень небольшое количество ОЗУ при любом заданном время. Тем не менее, я не уверен, как получить количество строк в файле (предположим, что я не могу найти количество строк и добавлять к ним по мере поступления новых пользователей). Есть ли способ, которым Python может это сделать, не читая весь файл и не сохраняя его сразу? Я уже пробовал len(), который, по-видимому, не работает с текстовыми файлами, но стоит попробовать. Один из способов, который я думал сделать для этого, не слишком велик, он включает в себя простое чтение строк по одной строке за раз в таком большом текстовом файле, а затем продолжающееся, когда я получаю сообщение об ошибке. Я бы предпочел не использовать этот способ, поэтому любые предложения будут оценены.

ответ

3

Вы можете просто перебирать файл обращаться непосредственно, который затем итерацию по нему линию за линией:

for line in file: 
    if username == line.strip(): 
     validusername = True 
     break 

Кроме того, вы не можете сказать, сколько строк файла имеет без глядя на него полностью. Вы знаете, насколько велик файл, и вы могли бы сделать некоторые предположения относительно числа символов, например (UTF-8 разрушает это, хотя: P); но вы не знаете, как долго каждая строка не видит ее, поэтому вы не знаете, где находится линия, и, как таковая, не может определить, сколько строк есть в общей сложности. Вам все равно придется смотреть на каждого персонажа один за другим, чтобы увидеть, начинается ли новая строка или нет.

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

+0

Я согласен, что это правильный путь, чтобы решить эту проблему, но вы знаете что-нибудь, что может позвольте мне получить длину файла? Это скорее гипотетическая ситуация, чем та, с которой я столкнулся или столкнулся. – KnightOfNi

+0

@ user2945577 Обновлен мой ответ :) – poke

+0

Ooops, __id__ зарезервировано python word – volcano

0

Если вы хотите количество строк в файле так плохо, почему бы вам не использовать len

with open("filename") as f: 
    num = len(f.readlines()) 
Смежные вопросы