Запись в файл в цикле for

text_file = open("new.txt", "r")

lines = text_file.readlines()

for line in lines:
        var1, var2 = line.split(",");
        myfile = open('xyz.txt', 'w')
        myfile.writelines(var1)
        myfile.close()
text_file.close()

У меня есть 10 строк текста в new.txt, таких как Adam: 8154 Джордж: 5234 и так далее. Теперь я хочу текстовый файл, содержащий только имена. xyz.txt должен содержать Адама Джорджа и так далее. Теперь приведенный выше код оставляет меня только с 10-м именем.

Как получить все 10 имен в одном текстовом файле.

Ответ 1

Это потому, что вы открываете, записываете и закрываете файл 10 раз внутри цикла for

myfile = open('xyz.txt', 'w')
myfile.writelines(var1)
myfile.close()

Вы должны открыть и закрыть свой файл за пределами цикла.

myfile = open('xyz.txt', 'w')
for line in lines:
    var1, var2 = line.split(",");
    myfile.write("%s\n" % var1)

myfile.close()
text_file.close()

Вы также должны заметить, что использовать write и not writelines.

writelines записывает список строк в ваш файл.

Также вы должны проверить ответы, опубликованные людьми здесь, в которых используется оператор with. Это элегантный способ делать операции чтения/записи файлов в Python

Ответ 2

Основная проблема заключалась в том, что вы неоднократно открывали/закрывали файлы внутри вашего цикла.

Попробуйте этот подход:

with open('new.txt') as text_file, open('xyz.txt', 'w') as myfile:  
    for line in text_file:
        var1, var2 = line.split(",");
        myfile.write(var1+'\n')

Мы открываем оба файла одновременно, и поскольку мы используем with, они будут автоматически закрыты, когда мы закончим (или произойдет исключение). Ранее ваш выходной файл неоднократно открывался внутри вашего цикла.

Мы также обрабатываем файл по строкам, а не сразу считываем его в память (что может быть проблемой при работе с действительно большими файлами).

Обратите внимание, что write() не добавляет новую строку ('\n'), поэтому вам нужно будет сделать это самостоятельно, если вам это нужно (я заменил ваш writelines() на write(), когда вы пишете один элемент, а не список элементов).

При открытии файла для чтения r, 'r' является необязательным, поскольку он является режимом по умолчанию.

Ответ 3

Предпочтительно использовать диспетчеры контекста для автоматического закрытия файлов

with open("new.txt", "r"), open('xyz.txt', 'w') as textfile, myfile:
for line in textfile:
    var1, var2 = line.split(",");
    myfile.writelines(var1)