あなたが何をしようとしているのかはまだわかりません(「わからない」とは、「完全に困惑している」ことを意味します)が、あなたが間違っていることのいくつかと、それを正しく行う方法を説明できると思います:
in_file=open(names,'r')
dir,file=os.path.split(names)
temp = os.path.join(dir,'***this is where i want to put a for loop
for each name in the input list of names***.xls')
この時点では、名前の入力リストはありません。これは からin_file
読んでいるもので、まだ読んでいません。後で、これらの名前を に読み込んでから、それらdata
を使用できます。そう:
in_file=open(names,'r')
dir,file=os.path.split(names)
data = []
for line in in_file:
data.append(line)
in_file.close()
for name in data:
temp = os.path.join(dir, '{}.xls'.format(name))
out_file=open(temp,'w')
関数呼び出しの外に for ループを置いていることに注意してください。おそらく、ファイルのループから作成された単一のパスを開くのではなく、そのループ内で各パスを開く(および各ファイルに何かを行う)必要があるためです。
しかし、for ループの使用を主張しない場合は、探していたものにより近いものがあるかもしれません: リスト内包表記です。名前のリストがあります。これを使用して、パスのリストを作成できます。そして、それを使用して、開いているファイルのリストを作成できます。このような:
paths = [os.path.join(dir, '{}.xls'.format(name)) for name in data]
out_files = [open(path, 'w') for path in paths]
その後、すべてのファイルに書き込みたい文字列を作成したら、次のようにします。
for out_file in out_files:
out_file.write(stuff)
しかし、これはちょっと変わったデザインです。主に、各ファイルを閉じる必要があるためです。それらはガベージ コレクションによって自動的に閉じられる可能性があり、そうでない場合でもフラッシュされる可能性があります…しかし、運が悪いと、書き込まれたデータはすべてメモリ内のバッファーに留まり、ディスクに書き込まれることはありません。通常、幸運に依存するプログラムを作成することは望ましくありません。したがって、ファイルを閉じます。この設計では、次のようなことを行う必要があります。
for out_file in out_files:
out_file.close()
最初に提案した 1 つの大きなループに戻る方がおそらくはるかに簡単なので、これを行うことができます。
for name in data:
temp = os.path.join(dir, '{}.xls'.format(name))
out_file=open(temp,'w')
out_file.write(stuff)
out_file.close()
または、さらに良い:
for name in data:
temp = os.path.join(dir, '{}.xls'.format(name))
with open(temp,'w') as out_file:
out_file.write(stuff)
ここにいる間、もう少しコメントを…</p>
まず、文字列から手動で .xls ファイルを生成しようとするべきではありません。のようなライブラリを使用できますopenpyxl
。または、代わりに .csv ファイルを作成することもできます。Python にcsv
組み込まれているライブラリを使用して簡単に作成でき、Excel で .xls ファイルと同じように簡単に処理できます。win32com
または、またはを使用pywinauto
して Excel を制御し、ファイルを作成させることもできます。実際、手動で生成しようとするよりも優れています。
第二に、あなたが書くことができるという事実for line in in_file:
は、 anin_file
がある種の行のシーケンスであることを意味します。したがって、list
行数に変換することだけが必要な場合は、1 つのステップでそれを行うことができます。
data = list(in_file)
しかし実際には、そもそもこのリストが必要な唯一の理由は、後でループして出力ファイルを作成できるようにするためですよね? それでは、そもそもファイル内の行をループしてループしないのはなぜでしょうか?
出力物を生成するために何をするにしても、最初にそれを行います。次に、ファイル名のリストを使用してファイルをループし、何かを書き込みます。このような:
stuff = # whatever you were doing later, in the code you haven't shown
dir = os.path.dirname(names)
with open(names, 'r') as in_file:
for line in in_file:
temp = os.path.join(dir, '{}.xls'.format(line))
with open(temp, 'w') as out_file:
out_file.write(stuff)
これにより、サンプル内のすべてのコードが置き換えられます (high_throughput
一部のモジュールをローカルにインポートしてから何もしないという名前の関数を除く)。