Python代码在一个目录中,数据库文件在另一个目录中。如何打开db和进程?

时间:2012-01-13 14:38:47

标签: python database shelve

我在文件夹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),则文件名到达Python代码的目录中,而数据库中没有任何数据。

我需要能够将最新返回的文件名放在" ",但不知道如何。

1 个答案:

答案 0 :(得分: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.join行中不需要shelve.open

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

顺便说一句,使用完整路径名的替代方法是更改​​当前目录:

os.chdir(path)

虽然这看起来更简单,但它也会使您的代码更难理解,因为读者必须跟踪当前工作目录的内容。 如果你只调用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