0

フォルダー A に db ファイルのディレクトリがあります。私の python コードは別の場所から実行されます。

次のコードを実行すると:

path = 'xxx'                    # path to file directory
filenames = os.listdir(path)    # list the directory file names
#pprint.pprint(filenames)       # print names
newest=max(filenames)
print newest                    # print most recent file name

# would like to open this file and write to it
data=shelve.open(newest, flag="w")

最後の行まで機能すると、次のようなエラーが表示されますneed "n" or "c" flag to run new db

最後の行にフラグがない場合、例: data=shelve.open(newest)、ファイル名は db にデータなしで Python コードのディレクトリに到着します。

newest によって返されたファイル名を " " に入れる必要がありますが、方法がわかりません。

4

1 に答える 1

4

newestは単なるファイル名です (例: test.db)。現在のディレクトリ (デフォルトではスクリプトが実行されたディレクトリ) は db フォルダーと同じではないため、フル パスを作成する必要があります。os.path.joinでそれを行うことができます:

data = shelve.open(os.path.join(path,newest), flag = "w") 

Geoff Gerrietts が指摘しているようにmax(filenames)、アルファベット順で最後に来るファイル名を返します。おそらく、それはあなたが望むファイルをあなたに与えるでしょう。ただし、最新の変更時刻のファイルが必要な場合は、次を使用できます

filenames = [os.path.join(path,name) for name in os.listdir(path)]
newest = max(filenames, key = os.path.getmtime)

このようにすると、完全なパス名になるため、次の行newestは必要ないことに注意してください。os.path.joinshelve.open

data = shelve.open(newest, flag = "w") 

ところで、フル パス名を使用する代わりに、現在のディレクトリを変更することもできます。

os.chdir(path)

これは単純に見えますが、読者は現在の作業ディレクトリが何であるかを追跡する必要があるため、コードが理解しにくくなる可能性もあります。1 回呼び出すだけであれば、おそらくこれは難しくありませんos.chdirが、複雑なスクリプトではos.chdir、多くの場所で呼び出すと、コードが少しスパゲッティのようになる可能性があります。

フルパス名を使用することで、何をしているのか疑問がなくなります。


各ファイルを開きたい場合:

import os
import contextlib

filenames = [os.path.join(path,name) for name in os.listdir(path)]
for filename in filenames:
    with contextlib.closing(shelve.open(filename, flag = "w")) as data:
        # do stuff with data
        # ...
        # data.close() will be called for you when Python leaves this with-block
于 2012-01-13T14:46:57.057 に答える