2011-01-17 3 views
8
 if data.find('!masters') != -1: 
     f = open('masters.txt') 
     lines = f.readline() 
     for line in lines: 
       print lines 
       sck.send('PRIVMSG ' + chan + " " + str(lines) + '\r\n') 
       f.close() 

masters.txt имеет список псевдонимов, как я могу распечатать каждую строку из файла за один раз ?. Код, который я напечатал только первый псевдоним. Ваша помощь будет оценена. Благодарю.Как выводить каждую строку в файле python

+0

Должно ли 'f.close()' быть вне цикла for? Кроме того, просто 'for line in open ('masters.txt'):' должен делать. –

+0

umm, который не работает, он печатает первую строку примерно в 5 раз – SourD

+0

Это потому, что ваш код читает только одну строку - делается только один вызов 'readline()'. 'lines' содержит только одну строку (на ней есть завершающая новая строка, BTW). Другая проблема заключается в том, что после того, как вы впервые напечатали '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' первый раз, вы закрываете файл,Однако 'for' будет пытаться выполнять выполнение для каждого * символа * в строке, хотя' print'ing и 'sck.send()' в той же строке снова и снова до тех пор, пока не произойдет ошибка. – martineau

ответ

19

Во-первых, как и @ l33tnerd сказал, f.close должен быть вне для цикла.

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

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    for line in f: 
      print line, 
      sck.send('PRIVMSG ' + chan + " " + line) 
    f.close() 

Наконец, вы имели в виду к переменной lines внутри петли; Я предполагаю, что вы хотели сослаться на line.

Редактировать: О, и вам нужно отстудить содержимое инструкции if.

+1

Кроме того, 'print line' должен иметь запятую в конце, чтобы избежать двойного интервала. – mgiuca

+2

По той же причине 'sck.send()', вероятно, не нуждается в '' \ r \ n'' в конце. – martineau

+0

О да. Я забыл даже посмотреть, что делает «sck.send». На самом деле это не обязательно 'str'. Таким образом, это должно быть просто 'sck.send ('PRIVMSG' + chan +" "+ line)' или, еще лучше, 'sck.send (« PRIVMSG% d% s »% (chan, line))'. – mgiuca

7

Вы, вероятно, хотите что-то вроде:

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    lines = f.read().splitlines() 
    f.close() 
    for line in lines: 
     print line 
     sck.send('PRIVMSG ' + chan + " " + str(line) + '\r\n') 

Не закрывайте это каждую итерацию цикла и линию печати вместо линий. Также используйте readlines для получения всех строк.

EDIT удалил мой другой ответ - другой в этом обсуждении является лучшей альтернативой, чем у меня, поэтому нет причин его копировать.

раздели Также от с \ п с чтения(). Splitlines()

+1

Это будет работать, но мое решение (как правило) лучше, поскольку оно сначала не будет считывать весь файл в память; он будет обрабатывать каждую строку, когда она считывает ее из файла. Недостаток моего заключается в том, что вы не можете закрыть файл, пока не закончите. – mgiuca

+1

@mgiuca - плакат никогда не упоминал ничего о размере файла. Память не будет проблемой, если файл мал, и я предполагаю список псевдонимов. –

+2

Да, я просто считаю, что хорошая практика не использовать память O (N), если вы можете избежать использования O (1) без особых проблем. – mgiuca

0

ли вы попробовать

for line in open("masters", "r").readlines(): print line 

?

readline() 

только читает «линию», с другой стороны

readlines() 

читает целые строки и дает вам список всех линий.

+1

Вы можете полностью избавиться от вызова readlines(). – wheaties

+0

Что еще более важно, 'readlines()' считывает весь файл в память с каждой строкой, а его конечная новая строка не повреждена, поэтому в строке «print line» выводятся два из них. Стиль 'для строки в open()' стиль чтения текстового файла также оставляет файл открытым после завершения цикла, так как нет возможности ссылаться на него снова и 'close()' it. – martineau

+0

Хмм, не знал, что .. Спасибо за комментарии;) –

4

Вы можете попробовать это. Он не считывает все данные в памяти сразу (используя итератор файлового объекта) и закрывает файл, когда код покидает блок с блоком.

if data.find('!masters') != -1: 
    with open('masters.txt', 'r') as f: 
     for line in f: 
      print line 
      sck.send('PRIVMSG ' + chan + " " + line + '\r\n') 

Если вы используете старую версию питона (до 2,6), вы будете иметь

from __future__ import with_statement 
2

Loop через файл.

f = open("masters.txt") 
lines = f.readlines() 
for line in lines: 
    print line 
Смежные вопросы