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

     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()

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

 SourD17 янв. 2011 г., 04:07
ммм, это не работает, он печатает первую строку примерно 5 раз
 li.davidm17 янв. 2011 г., 04:05
Долженf.close() быть за пределами цикла? Также простоfor line in open('masters.txt'): следует сделать.
 martineau17 янв. 2011 г., 05:28
Это потому, что ваш код читает только одну строку - только один вызовreadline() сделан.lines содержит только одну строку (с новой строкой, кстати). Другая проблема заключается в том, что после васprint а такжеsck.send() эта единственная строка вlines в первый раз вы закрываете файл, чтобы больше не читать из него, если попытаетесь.for однако постараюсь продолжать выполнение для каждогохарактер в линии, хотя,printиsck.send()повторяя одну и ту же строку до тех пор, пока не произойдет ошибка.

Ответы на вопрос(5)

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

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, чтобы получить все строки.

РЕДАКТИРОВАТЬ удалил мой другой ответ - другой в этом обсуждении - лучшая альтернатива, чем у меня, так что нет смысла копировать его.

Также удалил \ n с помощью read (). Splitlines ()

 martineau17 янв. 2011 г., 05:13
Похоже, что код в вашем ответе (и ОП) не учитывает тот факт, что обаreadline() а такжеreadlines() оба сохраняют последние символы новой строки в строке, которую они возвращают. В результате будет напечатано и отправлено много пустых строк.
 John Machin17 янв. 2011 г., 05:15
@SB: этот цикл while и два вызова f.readline делают ваш код ужасно похожим на Pascal. Просто используйтеfor line in f
 mgiuca17 янв. 2011 г., 04:24
Да, я просто считаю, что хорошей практикой является не использовать память O (N), если вы можете без проблем использовать O (1).
 NG.17 янв. 2011 г., 04:18
@mgiuca - постер никогда не упоминал о размере файла. Память не будет проблемой, если файл маленький, что я предполагаю, что список псевдонимов будет.
 mgiuca17 янв. 2011 г., 04:11
Это будет работать, но мое решение (обычно) лучше, так как оно не будет сначала читать весь файл в память; он будет обрабатывать каждую строку, считывая ее из файла. Мой недостаток в том, что вы не можете закрыть файл, пока не закончите.

Ты пробовал

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

?

readline() 

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

readlines()

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

 martineau17 янв. 2011 г., 14:04
Важнееreadlines() читает весь файл в память с каждой строкой и завершающей новой строкой, так чтоprint line выведет два из них.for line in open() Стиль кодирования чтения текстового файла также оставляет файл открытым после завершения цикла, так как нет способа снова обратиться к нему иclose() Это.
 Serdar Dalgic18 янв. 2011 г., 02:11
хм, не знал что .. Спасибо за комментарии;)
 wheaties17 янв. 2011 г., 04:58
Вы можете полностью избавиться от вызова readlines ().

Перебрать файл.

f = open("masters.txt")
lines = f.readlines()
for line in lines:
    print line

ьзуя итератор объекта файла) и закрывает файл, когда код покидает блок with.

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')

Если вы используете более старую версию Python (до 2.6), вам придется иметь

from __future__ import with_statement
Решение Вопроса

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 заявление.

 martineau17 янв. 2011 г., 05:31
По той же причинеsck.send() наверное не нужен'\r\n' в конце.
 martineau17 янв. 2011 г., 13:46
Или, в качестве альтернативы,sck.send("PRIVMSG {0} {1}".format(chan, line)), Независимо от того, какую форму вы предпочитаете, я предлагаю вам обновить свой ответ.
 mgiuca17 янв. 2011 г., 09:32
О да. Я забыл даже посмотреть на чтоsck.send делал. Это действительно не нужноstr или. Так и должно бытьsck.send('PRIVMSG ' + chan + " " + line)или, еще лучше,sck.send("PRIVMSG %d %s" % (chan, line)).
 mgiuca17 янв. 2011 г., 04:10
Такжеprint line должен иметь запятую в конце, чтобы избежать двойного пробела.

Ваш ответ на вопрос