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 большинство ресурсов, которые я нашел, были выше моей головы, я все еще мирянин.

5 82

5 ответов:

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

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

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

почему я не могу использовать строку для новой строки в 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() перебирает эту последовательность строк и записывает каждый элемент.

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

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

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

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

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

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

экономия рассол:

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

и погрузки:

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

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

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