Как написать список строк в файл, добавив новые строки? - PullRequest
12 голосов
/ 25 марта 2011
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".

Ответы [ 9 ]

17 голосов
/ 25 марта 2011

Изменить

data.write(c + n)

на

data.write("%s%s\n" % (c, n))
5 голосов
/ 25 марта 2011

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

4 голосов
/ 25 марта 2011

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

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

data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))
1 голос
/ 23 декабря 2015

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

1 голос
/ 15 января 2014

Изменение

data.write(c+n)

до

data.write(c+n+'\n')
1 голос
/ 25 марта 2011

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

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

print  >> data, c+n

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

print(c+n, file=data)
0 голосов
/ 19 сентября 2014

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

with open(fname,'wb') as f:
    for row in var:
        f.write(repr(row)+'\n')
0 голосов
/ 25 марта 2011

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

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

data = open("list.txt", "w")
for c in s_chars:
    data.write("%s%s\n" % (c, c.join(nums)))
data.close()
0 голосов
/ 25 марта 2011
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()

OR

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

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

...