Как написать список строк в файл, добавив новые строки?

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]

    data = open("list.txt", "w")
    for c in s_chars:
        for n in nums:
            data.write(c + n)
    data.close()

Я хотел бы добавить новую строку после каждого "c + n".

Ответ 1

Изменить

data.write(c + n)

к

data.write("%s%s\n" % (c, n))

Ответ 2

Правильно размещенный data.write('\n') будет обрабатывать это. Просто вставьте его соответствующим образом для цикла, который вы хотите перенести.

Ответ 3

Как уже указывали другие ответы, вы можете сделать это, добавив "\n" в c+n или используя строку формата "% s% s\n".

Как бы интересный вопрос, я думаю, что было бы более pythonic использовать понимание списка вместо двух вложенных циклов:

data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))

Ответ 4

Python print - стандартная функция "print with newline".

Следовательно, вы можете напрямую, если используете Python 2.x:

print  >> data, c+n

Если вы используете Python 3.x:

print(c+n, file=data)

Ответ 5

Изменить

data.write(c+n)

к

data.write(c+n+'\n')

Ответ 6

Нажимаем больше работы на слой C с помощью writelines и product:

from future_builtins import map  # Only do this on Python 2; makes map generator function
import itertools

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]
    # Append newlines up front, to avoid doing the work len(nums) * len(s_chars) times
    # product will realize list from generator internally and discard values when done
    nums_newlined = (n + "\n" for s in nums)

    with open("list.txt", "w") as data:
        data.writelines(map(''.join, itertools.product(s_chars, nums_newlined)))

Это создает тот же эффект, что и вложенный цикл, но делает это со встроенными функциями, реализованными на C (в интерпретаторе ссылок на CPython), удаляя служебные данные выполнения байтового кода из изображения; это может значительно повысить производительность, особенно для больших входов, и в отличие от других решений, включающих '\n'.join всего вывода в одну строку для выполнения одного вызова write, он выполняет итерацию при записи, поэтому использование пиковой памяти остается фиксированным, а не требуя, чтобы вы полностью реализовали весь вывод в памяти в одной строке.

Ответ 7

Это работает для меня

with open(fname,'wb') as f:
    for row in var:
        f.write(repr(row)+'\n')

Ответ 8

def generator():
     nums = ['09', '98', '87', '76', '65', '54', '43']
     s_chars = ['*', '&', '^', '%', '$', '#', '@',]

     data = open("list.txt", "w")
     for c in s_chars:
        for n in nums:
           data.write(c + n + "\n")
     data.close()

ИЛИ

def generator():
     nums = ['09', '98', '87', '76', '65', '54', '43']
     s_chars = ['*', '&', '^', '%', '$', '#', '@',]

     data = open("list.txt", "w")
     for c in s_chars:
        for n in nums:
           data.write(c + n)
        data.write("\n")
     data.close()

в зависимости от того, что вы хотите.

Ответ 9

В предыдущем ответе я сделал неправильный ответ, потому что я неправильно понял требования, пожалуйста, проигнорируйте его.

Я думаю, вы можете использовать join для упрощения внутреннего цикла

data = open("list.txt", "w")
for c in s_chars:
    data.write("%s%s\n" % (c, c.join(nums)))
data.close()