Как записать список в файл с новыми строками в 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 помещает последнюю новую строку в конце файла.

843   2  

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

Не используйте print для записи в файлы-используйте 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 для записи в ваши файлы. Таким образом, вам не придется беспокоиться о том, как разные платформы обрабатывают новые строки.

Здесь много ошибок.

  1. Ваш отступ испорчен.
  2. атрибут text в файле save_to_file относится ко всем аргументам, а не только к конкретному аргументу.
  3. Вы используете "текстовый режим", что также сбивает с толку. Вместо этого используйте двоичный режим, чтобы у вас было последовательное и определенное значение для '\n'.

Когда вы перебираете "строки в тексте", из-за этих ошибок, то на самом деле вы перебираете свои аргументы в тексте. функция, потому что "текст" представляет все ваши аргументы. Вот что делает"*". (По крайней мере, в этой ситуации. Строго говоря, он повторяет все остальные аргументы - пожалуйста, прочитайте документацию).

Comments

    Ничего не найдено.