Как записать список в файл с новыми строками в Python3
Я пытаюсь написать массив (список?) в текстовый файл с использованием Python 3. В настоящее время у меня есть:
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
print(lines, file = myfile)
myfile.close
Это записывает то, что выглядит как массив прямо в текстовый файл, т. е.
['element1', 'element2', 'element3']
username@machine:/path$
То, что я хочу сделать, это создать файл с помощью
element1
element2
element3
username@machine:/path$
Я пробовал разные способы перебора и добавления "n", но похоже, что запись сбрасывает массив в одной операции. Вопрос похож на Как записать список строк в файл, добавив новые строки? но синтаксис выглядел так, как это было для Python 2? Когда я попробовал его модифицированную версию:
def save_to_file(*text):
myfile = open('/path/to/filename.txt', mode='wt', encoding='utf-8')
for lines in text:
myfile.write(lines)
myfile.close
...оболочка Python выдает "TypeError: должен быть str, а не list", что, по-моему, связано с изменениями между Python2 и Python 3. Чего мне не хватает, чтобы получить каждый элемент в новой строке?
EDIT: спасибо @agf и @arafangion; объединив то, что вы оба написали, я придумал:
def save_to_file(text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('n'.join(text))
myfile.write('n')
Похоже, что у меня была часть проблемы с "* текстом " (Я читал, что расширяет аргументы, но это не так нажимайте, пока вы не напишете, что [элемент] становится [[элемент]], что я получаю ошибку типа str-not-list; я все время думал, что мне нужно сказать определению, что он получает список/массив, переданный ему, и что просто заявив "тест" будет строкой.) Это сработало, как только я изменил его на просто текст и использовал myfile.запись с помощью join, и дополнительный n помещает последнюю новую строку в конце файла.
2 ответов:
myfile.close-- Избавьтесь от этого там, где вы используетеwith.withавтоматически закрываетmyfile, и вы должны вызватьcloseкакclose()в любом случае, чтобы он сделал что-нибудь, когда вы не используетеwith. Вы должны просто всегда использоватьwithна Python 3.with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile: myfile.write('\n'.join(lines))Не используйте
file.write. В этом случае вы хотите написать несколько строк с разрывами между ними, поэтому вы можете просто соединить строки с'\n'.join(lines)и записать строку, созданную непосредственно в файл.Если элементы
linesне являются строками, попробуйте:myfile.write('\n'.join(str(line) for line in lines))Чтобы обратить их в первую очередь.
Ваша вторая версия не работает по другой причине. Если вы пройдете['element1', 'element2', 'element3']To
def save_to_file(*text):Он станет
[['element1', 'element2', 'element3']]Потому что
*помещает каждый аргумент, который он получает в список, даже если то, что вы передаете, уже является списком.Если вы хотите поддерживать передачу нескольких списков и все еще писать их один за другим, сделайте
def save_to_file(*text): with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile: for lines in text: myfile.write('\n'.join(str(line) for line in lines)) myfile.write('\n')Или, только для одного списка, получить избавьтесь от
*и сделайте то, что я сделал выше.Edit: @Arafangion прав, вы, вероятно, должны просто использовать
bвместоtдля записи в ваши файлы. Таким образом, вам не придется беспокоиться о том, как разные платформы обрабатывают новые строки.
Здесь много ошибок.
- Ваш отступ испорчен.
- атрибут text в файле save_to_file относится ко всем аргументам, а не только к конкретному аргументу.
- Вы используете "текстовый режим", что также сбивает с толку. Вместо этого используйте двоичный режим, чтобы у вас было последовательное и определенное значение для '\n'.
Когда вы перебираете "строки в тексте", из-за этих ошибок, то на самом деле вы перебираете свои аргументы в тексте. функция, потому что "текст" представляет все ваши аргументы. Вот что делает"*". (По крайней мере, в этой ситуации. Строго говоря, он повторяет все остальные аргументы - пожалуйста, прочитайте документацию).
Comments