Подтвердить что ты не робот

Python - write() и writelines() и конкатенированные строки

Итак, я изучаю Python. Я просматриваю уроки и сталкивался с проблемой, когда мне приходилось конденсировать большое количество target.write() в один write(), имея "\n" между каждой пользовательской входной переменной (объект write()).

Я придумал:

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

Если я попытаюсь сделать:

textdoc.write(lines)

Я получаю сообщение об ошибке. Но если я напечатаю:

textdoc.write(line1 + "\n" + line2 + ....)

Тогда он отлично работает. Почему я не могу использовать строку для новой строки в write(), но я могу использовать ее в writelines()?

Python 2.7 Когда я искал google большинство ресурсов, которые я нашел, это было над моей головой, я все еще мирянин.

4b9b3361

Ответ 1

writelines ожидает список строк, а write ожидает одну строку.

line1 + "\n" + line2 объединяет эти строки вместе в одну строку, прежде чем передать ее в write.

Обратите внимание, что если у вас много строк, вы можете использовать "\n".join(list_of_lines).

Ответ 2

Почему я не могу использовать строку для новой строки в write(), но я могу использовать ее в writelines()?

Идея следующая: если вы хотите написать одну строку, вы можете сделать это с помощью write(). Если у вас есть последовательность строк, вы можете написать их все, используя writelines().

write(arg) ожидает строку как аргумент и записывает ее в файл. Если вы предоставите список строк, это вызовет исключение (кстати, покажите нам ошибки!).

writelines(arg) ожидает итерабельность как аргумент (итерируемый объект может быть кортежем, списком, строкой или итератором в самом общем смысле). Ожидается, что каждый элемент, содержащийся в итераторе, будет строкой. Кортеж строк - это то, что вы предоставили, поэтому все сработало.

Характер строки (ов) не имеет значения для обеих функций, т.е. они просто записывают в файл все, что вы им предоставляете. Интересная часть состоит в том, что writelines() не добавляет символы новой строки самостоятельно, поэтому имя метода может быть довольно запутанным. Он действительно ведет себя как мнимый метод под названием write_all_of_these_strings(sequence).

Далее следует идиоматический способ в Python записать список строк в файл, сохраняя каждую строку в своей строке:

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.write('\n'.join(lines))

Это поможет вам закрыть файл. Конструкция '\n'.join(lines) объединяет (связывает) строки в списке lines и использует символ "\n" в качестве клей. Это более эффективно, чем использование оператора +.

Начиная с той же последовательности lines, заканчивая тем же выходом, но используя writelines():

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.writelines("%s\n" % l for l in lines)

Это использует выражение генератора и динамически создает строки с завершающим расширением строки. writelines() выполняет итерацию по этой последовательности строк и записывает каждый элемент.

Изменить: Еще один момент, о котором вы должны знать:

write() и readlines() существовали до ввода writelines(). writelines() был представлен позже как аналог readlines(), так что можно было легко записать содержимое файла, которое было просто прочитано через readlines():

outfile.writelines(infile.readlines())

Действительно, это главная причина, по которой writelines имеет такое запутанное имя. Кроме того, сегодня мы больше не хотим использовать этот метод. readlines() считывает весь файл в память вашего компьютера до того, как writelines() начнет записывать данные. Прежде всего, это может тратить время. Почему бы не начать писать части данных во время чтения других частей? Но, самое главное, этот подход может быть очень потребляющим память. В крайнем случае, когда входной файл больше, чем память вашего компьютера, этот подход даже не работает. Решение этой проблемы - использовать только итераторы. Рабочий пример:

with open('inputfile') as infile:
    with open('outputfile') as outfile:
        for line in infile:
            outfile.write(line)

Это считывает входной файл по строкам. Как только одна строка будет прочитана, эта строка записывается в выходной файл. С точки зрения схемы, всегда есть только одна строка в памяти (по сравнению со всем содержимым файла, находящимся в памяти в случае подхода readlines/writelines).

Ответ 3

На самом деле, я думаю, проблема в том, что ваши переменные "строки" плохие. Вы определили строки как кортеж, но я считаю, что write() требует строку. Все, что вам нужно изменить, это ваши запятые в плюсы (+).

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

должен работать.

Ответ 4

если вы просто хотите сохранить и загрузить список, попробуйте Pickle

Сохранение сокетов:

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

и загрузка:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

Ответ 5

Упражнение 16 из книги Зеда Шоу? Вы можете использовать escape-символы следующим образом:

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()