Итак, я изучаю 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, большинство ресурсов, которые я находил, были выше моей головы, я все еще был неспециалистом.
python
string
file-io
python-2.x
AbeLinkon
источник
источник
lines
не является строкой в вашем примере. Это кортеж, состоящий из шести строк.Ответы:
writelines
ожидает итерацию строкwrite
ожидает одну строку.line1 + "\n" + line2
объединяет эти строки в одну перед передачей вwrite
.Обратите внимание: если у вас много строк, вы можете использовать
"\n".join(list_of_lines)
.источник
writelines
ожидает итеративного. Вы можете использовать список, кортеж или генератор.write
вместо этого,writelines
если у вас много строк? Линии записи могли бы быть более эффективными, поскольку им не нужно создавать временную объединенную строку, просто повторяя строки.Почему я не могу использовать строку для перевода строки в write (), но могу использовать ее в Writelines ()?
Идея заключается в следующем: если вы хотите написать одну строку, вы можете сделать это с помощью
write()
. Если у вас есть последовательность строк, вы можете записать их все, используяwritelines()
.write(arg)
ожидает строку в качестве аргумента и записывает ее в файл. Если вы предоставите список строк, это вызовет исключение (кстати, покажите нам ошибки!).writelines(arg)
ожидает итератор в качестве аргумента (итеративный объект может быть кортежем, списком, строкой или итератором в самом общем смысле). Ожидается, что каждый элемент, содержащийся в итераторе, будет строкой. Вы предоставили кортеж строк, поэтому все сработало.Природа строки (строк) не имеет значения для обеих функций, т.е. они просто записывают в файл все, что вы им предоставляете. Интересно то, что
writelines()
символы новой строки не добавляются сами по себе, поэтому имя метода может сбивать с толку. На самом деле он ведет себя как вызываемый воображаемый методwrite_all_of_these_strings(sequence)
.Далее следует идиоматический способ в Python записать список строк в файл, сохраняя при этом каждую строку в отдельной строке:
Это позаботится о закрытии файла за вас. Эта конструкция
'\n'.join(lines)
объединяет (соединяет) строки в спискеlines
и использует символ '\ n' в качестве связующего. Это более эффективно, чем использование+
оператора.Начиная с той же
lines
последовательности, заканчивая тем же результатом, но используяwritelines()
:Это использует выражение генератора и динамически создает строки, завершающиеся новой строкой.
writelines()
перебирает эту последовательность строк и записывает каждый элемент.Изменить: еще один момент, о котором вы должны знать:
write()
иreadlines()
существовала до того, какwritelines()
была введена.writelines()
был представлен позже как аналогreadlines()
, чтобы можно было легко записать содержимое файла, которое было только что прочитано, черезreadlines()
:На самом деле, это основная причина
writelines
такого запутанного названия. Кроме того, сегодня мы больше не хотим использовать этот метод.readlines()
считывает весь файл в память вашего компьютера перед тем, какwritelines()
начать запись данных. Во-первых, это может напрасно тратить время. Почему бы не начать записывать части данных во время чтения других частей? Но, что наиболее важно, этот подход может потреблять очень много памяти. В крайнем случае, когда размер входного файла превышает размер памяти вашего компьютера, этот подход даже не сработает. Решение этой проблемы - использовать только итераторы. Рабочий пример:Это считывает входной файл построчно. Как только одна строка прочитана, эта строка записывается в выходной файл. Схематично говоря, всегда есть только одна строка в памяти (по сравнению со всем содержимым файла, находящимся в памяти в случае подхода строк чтения / записи).
источник
write()
иwritelines()
в основном эквивалентны, и их использование также является вопросом личного вкуса. Однако важно отметить, что для очень длинного списка строк (называемыхlines
) писать менее эффективно,f.write('\n'.join(lines))
чемfor l in line: f.write('%s\n' % l)
. В первом случае перед записью в памяти создается совершенно новая и очень длинная строка. Во втором случае данные записываются кусочно.outf.writelines(inf.readlines())
лучшеoutf.writelines(inf)
. Функция, которую мы больше не хотим использовать, -readlines()
нетwritelines()
.writelines()
, его семантика, как объяснялось, не идеальна. Поэтому я никогда им не пользовался. И я никогда этого не упускал.если вы просто хотите сохранить и загрузить список, попробуйте Pickle
Сохранение рассола:
и загрузка:
источник
На самом деле, я думаю, проблема в том, что ваша переменная "lines" плохая. Вы определили строки как кортеж, но я считаю, что write () требует строки. Все что вам нужно поменять запятые на плюсы (+).
должно сработать.
источник
Упражнение 16 из книги Зеда Шоу? Вы можете использовать escape-символы следующим образом:
источник
" \n ".join((line1, line2, line3))
.