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')
がそれを処理します。句読点を付けたいループに合わせて適切にインデントします。
他の回答ですでに指摘したように、c+n
に '\ n'を追加するか、フォーマット文字列 "%s%s\n"を使用することで実行できます。
関心事として、2つのネストされたループの代わりにリスト内包表記を使用する方がPythonicだと思います。
data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))
変化する
data.write(c+n)
に
data.write(c+n+'\n')
Pythonのprint
は、標準の「改行付き印刷」関数です。
したがって、Python 2.xを使用すると、直接実行できます。
print >> data, c+n
Python 3.xを使用する場合:
print(c+n, file=data)
writelines
およびproduct
を使用してCレイヤーにさらに作業をプッシュする:
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つの文字列で実現する必要はありません。
これは私のために働く
with open(fname,'wb') as f:
for row in var:
f.write(repr(row)+'\n')