我在文件夹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代码的目录中,而数据库中没有任何数据。
我需要能够将最新返回的文件名放在" ",但不知道如何。
答案 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