Python代码在一个目录中,数据库文件在另一个目录中。如何打开数据库并进行处理?

Python代码在一个目录中,数据库文件在另一个目录中。如何打开数据库并进行处理?,python,database,shelve,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

我在文件夹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")
它一直工作到最后一行,然后我得到一个错误,它说:
需要“n”或“c”标志来运行新的db

如果没有最后一行中的标志,例如:
data=shelve.open(newest)
,则文件名到达Python代码的目录时,数据库中没有任何数据


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

latest
只是文件名(例如
test.db
)。由于当前目录(默认情况下,运行脚本的目录)与db文件夹不同,因此需要形成完整路径。您可以通过以下方式实现:

正如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

latest
只是文件名(例如
test.db
)。由于当前目录(默认情况下,运行脚本的目录)与db文件夹不同,因此需要形成完整路径。您可以通过以下方式实现:

正如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

你能说得更清楚一点吗?谢谢这是
max()
的特殊用法。DB位置是否固定(如中所示,它在运行程序的过程中不会改变)?您能更明确一点吗?谢谢这是
max()
的特殊用法。DB位置是否固定(如中所示,在运行程序的过程中不会改变)?unutbu的解决方案是正确的。我不确定“max(filenames)”是否会像代码所建议的那样为您提供最新的文件。“max(filenames)”将返回按字母顺序排列的最后一个文件名:max([“c”、“b”、“e”、“a”]=>“e”。谢谢你,unutbu,它工作得很好!Makoto-是的,虽然它返回了最新的文件,但它并没有很好地使用max()。我是n00B,很快就会寻找更好的解决方案!Hm.unutbu-这将返回文件“fileopen.py”,第19行,最新=max(文件名,key=os.path.getmtime)文件“/usr/lib/python2.7/genericpath.py”,第54行,在getmtime返回os.stat(文件名)中.st_mtime…用谷歌搜索Getmtimoops!这和以前的问题一样。
os.path.getmtime
需要一个完整的路径,而不仅仅是文件名。我编辑了上面的帖子来说明如何解决这个问题。所以现在我已经达到了预期的max()问题。我真正想做的是读取所有文件filenames=os.listdir(path)然后一个接一个地打开,获取一些数据,关闭文件,继续下一个文件。unutbu的解决方案是正确的。我不确定“max(文件名)”是否会像代码所示为您提供最新的文件。“max(文件名)”将返回按字母顺序排列的最后一个文件名:max([“c”、“b”、“e”、“a”]=>“e”.unutbu,非常好用!Makoto-是的,虽然它确实返回了最新的文件,但max()的使用不是很好。我是n00B,很快就会寻找更好的解决方案!Hm.unutbu-这将返回文件“fileopen.py”,第19行,格式为最新的=max(filenames,key=os.path.getmtime)文件“/usr/lib/python2.7/genericpath.py”,第54行,在getmtime return os.stat(filename).st_mtime…google getmtimeOops!这和以前的问题是一样的。
os.path.getmtime
需要一个完整的路径,而不仅仅是文件名。我已经编辑了上面的帖子来展示如何解决这个问题。所以现在我已经达到了预期的最大值()问题。我真正想做的是读取所有文件filenames=os.listdir(path)并逐个打开,获取一些数据,关闭文件,然后转到下一个文件。