2016-06-16 2 views
1

Как работает while в питоне при чтении строк?Python: Как работает цикл while в python при чтении строк?

state=True #can be set to {anyInterger,True,False} 
while state: 
    #do a task 
    #if task done change state to exit loop 

так, в зависимости от переменной state в то время как цикл выполняется, и type(state) может быть BOOL, INT

но читать строки из файла, используя while, как упомянуто ниже

f=open('test.txt','r') 
line_data=[] 
line=f.readline() 
while line: 
    line_data.append(line) 
    line=f.readline() 
f.close() 

после того, как чтение всех строк окончательно line='' но type('') is str

Так как же while замыкание петли?

Я знал, что это можно было бы сделать лучше, используя with и for, причина не использовать в то время как петля для этой цели было бы полезно

+5

'bool ('') == False' –

+1

https://docs.python.org/3/library/stdtypes.html#truth-value-testing –

+0

https://docs.python.org/3/tutorial/ inputoutput.html # methods-of-file-objects –

ответ

2

В Python имеется несколько неявных булевых преобразований.
1) bool(0) имеет значение false, любые другие целые числа оценки для True
2) bool(''), bool([]), bool({}) также оценить, False. Это полезно, чтобы проверить, имеет ли контейнер какие-либо предметы в нем (не пустые строки, списки, dicts и т.д. вычисляться True)

Так что в вашем случае readline читать пустую строку, которая получила неявно обратились к bool и оцененную в False, поэтому цикл расторгла

1

Всякий раз, когда вы используете переменную в качестве условия в if или кольцую while оценивается как логическое значение. В Python пустая строка обрабатывается как False, поэтому цикл while завершается.

причиной отказа от использования в то время как петля для этой цели было бы полезно

Вы должны попросить причины использованияwhile петли для этой цели.

Сравните это:

f = open('test.txt','r') 
line_data = [] 
line = f.readline() 
while line: 
    line_data.append(line) 
    line = f.readline() 
f.close() 

К этому:

with open('test.txt','r') as f: 
    lines = f.readlines() 
+0

Почему вы удаляете первую строку? –

+0

@DavidCullen Потому что это то, что делает код OP. – DeepSpace

+0

Первый вызов 'append' в коде OP добавит первую строку. –

1

f.readline() является объектом генератор, который возвращает '' в конец файла. Но '' имеет falsy значение:

>>> f.readline() 
'' 
>>> bool('') 
False 

Следовательно, когда while оценивает линию на EOF (End Of File), значение является таким же, как False.

следующие значения считаются False (см docs):

None 
False 
zero of any numeric type, for example, 0, 0L, 0.0, 0j. 
any empty sequence, for example, '',(), []. 
any empty mapping, for example, {}. 
instances of user-defined classes, if the class defines a __nonzero__() or __len__() method, when that method returns the integer zero or bool value False 
0

Пустая строка рассматривается как в питоне ложных. Таким образом, он не войдет в цикл. FYI лучший способ петли над линиями

line_data = [] 
for line in f.readlines(): 
    line_data.append(line) 

Вы можете даже сделать это тоже.

with open('test.txt', 'r') as f: 
    line_data = [line for line in f.readlines() 
+0

'f.readlines()' уже возвращает список. Это совершенно бесполезно, чтобы создать понимание списка из него. – DeepSpace

+0

Да, это так. Это просто для его понимания цели. –

+0

И 'readlines()' просто пустая трата памяти. 'для строки в f:' достаточно. – Matthias

-1

Вы можете добавить:

if len(line) < 2: 
    break 

или в качестве альтернативы:

if line == "''": 
    break 
+4

Ваш второй пример не будет работать. '' '' "! = ''' – DeepSpace

Смежные вопросы