1

だから私は名前のリストをインポートしています。

テキストファイルには次が含まれます。

Eleen
Josh
Robert
Nastaran
Miles

my_list = ['Eleen','Josh','Robert','Nastaran','Miles']

次に、各名前をリストに割り当て、そのリスト内の名前ごとに新しい Excel ファイルを作成したいと考えています。

#1.   Is there anyway I can create a for loop where on the line:
temp = os.path.join(dir,'...'.xls')
_________________________  
def high_throughput(names):
    import os
    import re


# Reading file

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')
out_file=open(temp,'w')

data = []

for line in in_file:
    data.append(line)

in_file.close()
4

3 に答える 3

0

あなたが何をしようとしているのかはまだわかりません(「わからない」とは、「完全に困惑している」ことを意味します)が、あなたが間違っていることのいくつかと、それを正しく行う方法を説明できると思います:

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一部のモジュールをローカルにインポートしてから何もしないという名前の関数を除く)。

于 2013-02-14T19:41:52.810 に答える
0

openpyxl特にファイルを作成する必要がある場合は、を参照してください.xlsx。以下の例では、Excel ワークブックが空白として作成されていることを前提としています。

from openpyxl import Workbook
names = ['Eleen','Josh','Robert','Nastaran','Miles']
for name in names:
    wb = Workbook()
    wb.save('{0}.xlsx'.format(name))
于 2013-02-12T21:23:21.327 に答える