0

を使用してスプレッドシートを保存するときに使用されるファイル名を自動化したいxlwtDataPythonプログラムが実行されているフォルダに名前が付けられたサブディレクトリがあるとします。プログラムにそのフォルダー内のファイルの数をカウントさせたい(#= n)。次に、ファイル名は(n + 1)で終わる必要があります。フォルダに0個のファイルがある場合、ファイル名は。でなければなりませんTrial_1.xls。このファイルは、そのサブディレクトリに保存する必要があります。

私は次のことを知っています:

import xlwt, os, os.path
n = len([name for name in os.listdir('.') if os.path.isfile(name)])

同じフォルダ内のファイルの数をカウントします。

a = n + 1
filename = "Trial_" + "a" + ".xls"
book.save(filename)

これにより、適切な名前のファイルが同じフォルダに保存されます。

私の質問は、これをサブディレクトリに拡張するにはどうすればよいですか?ありがとう。

4

3 に答える 3

3

os.listdir('.')これ.は、ファイルが実行されるディレクトリを指します。.目的のサブディレクトリを指すようにを変更します。

ファイルシステムのルートからのフルパス名を付ける必要があります。それ以外の場合は、スクリプトが実行されるディレクトリを基準にしています。これはあなたが望むものではないかもしれません。特に、別のプログラムからサブディレクトリを参照する必要がある場合。

filenameまた、変数へのフルパスを指定する必要があります。これにはサブディレクトリが含まれます。

作業を楽にするために、変数へのフルパスを設定し、必要に応じてそれを参照するだけです。

TARGET_DIR = '/home/me/projects/data/'
n = sum(1 for f in os.listdir(TARGET_DIR) if os.path.isfile(os.path.join(TARGET_DIR, f)))
new_name = "{}Trial_{}.xls".format(TARGET_DIR,n+1)
于 2012-11-18T06:47:55.720 に答える
3

あなたは実際にグロブが欲しいです:

from glob import glob    

DIR = 'some/where/'
existing_files = glob(DIR + '*.xls')
filename = DIR + 'stuff--%d--stuff.xls' % (len(existing_files) + 1)
于 2012-11-18T12:11:04.203 に答える
0

Burhan Khalidの答えは「完璧に機能します!」と言ったので。あなたはそれを受け入れるべきです。

数を計算する別の方法を指摘したかっただけです。あなたのやり方はうまくいきますが、砂の粒を数えていると想像すると、何かがあまりにも多くのメモリを使用するでしょう。カウントを取得するためのより直接的な方法は次のとおりです。

n = sum(1 for name in os.listdir('.') if os.path.isfile(name))

対象となる名前ごとに1が取得され、これらすべての1が入力されsum()、カウントが取得されます。

このコードは、リスト内包表記の代わりに「ジェネレータ式」を使用していることに注意してください。上記のコードは、リストを作成し、その長さを取得してからリストを破棄する代わりにsum()、カウントを計算するために反復するイテレーターを作成するだけです。

少し卑劣ですが、使用できるショートカットがあります。sum()ブール値を受け入れTrue、1およびFalse0として扱います。これらを合計できます。

# sum will treat Boolean True as a 1, False as a 0
n = sum(os.path.isfile(name) for name in os.listdir('.'))

これは十分にトリッキーなので、コメントを付けずにこれを使用することはおそらくないでしょう。しかし、これがPythonで物事を数えるための最も速く最も効率的な方法だと思います。

于 2012-11-18T07:26:45.970 に答える