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 ответов:
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)