Ответ 1
Изменить
data.write(c + n)
к
data.write("%s%s\n" % (c, n))
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".
Изменить
data.write(c + n)
к
data.write("%s%s\n" % (c, n))
Правильно размещенный data.write('\n')
будет обрабатывать это. Просто вставьте его соответствующим образом для цикла, который вы хотите перенести.
Как уже указывали другие ответы, вы можете сделать это, добавив "\n" в c+n
или используя строку формата "% s% s\n".
Как бы интересный вопрос, я думаю, что было бы более pythonic использовать понимание списка вместо двух вложенных циклов:
data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))
Python print
- стандартная функция "print with newline".
Следовательно, вы можете напрямую, если используете Python 2.x:
print >> data, c+n
Если вы используете Python 3.x:
print(c+n, file=data)
Изменить
data.write(c+n)
к
data.write(c+n+'\n')
Нажимаем больше работы на слой 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
, он выполняет итерацию при записи, поэтому использование пиковой памяти остается фиксированным, а не требуя, чтобы вы полностью реализовали весь вывод в памяти в одной строке.
Это работает для меня
with open(fname,'wb') as f:
for row in var:
f.write(repr(row)+'\n')
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()
в зависимости от того, что вы хотите.
В предыдущем ответе я сделал неправильный ответ, потому что я неправильно понял требования, пожалуйста, проигнорируйте его.
Я думаю, вы можете использовать join
для упрощения внутреннего цикла
data = open("list.txt", "w")
for c in s_chars:
data.write("%s%s\n" % (c, c.join(nums)))
data.close()