如何在特定目录中打开 python 搁置文件

Posted

技术标签:

【中文标题】如何在特定目录中打开 python 搁置文件【英文标题】:How can I open a python shelve file in a specific directory 【发布时间】:2017-08-31 16:29:13 【问题描述】:

我正在研究 Ch. 8 “Automate the Boring Stuff With Python”,试图扩展 Multiclipboard 项目。这是我的代码:

#! /usr/bin/env python3

# mcb.pyw saves and loads pieces of text to the clipboard
# Usage:        save <keyword> - Saves clipboard to keyword.
#               <keyword> - Loads keyword to the clipboard.
#               list - Loads all keywords to clipboard.
#               delete <keyword> - Deletes keyword from shelve.

import sys, shelve, pyperclip, os

# open shelve file
dbFile = os.path.join('Users', 'dustin', 'Documents', 'repos', 'python', 'mcbdb')
shelfFile = shelve.open(dbFile)


# Save clipboard content
if len(sys.argv) == 3 and sys.argv[1].lower() == 'save':
   shelfFile[sys.argv[2]]= pyperclip.paste()

# Delete choosen content
elif len(sys.argv) == 3 and sys.argv[1].lower() == 'delete':
        if sys.argv[2] in list(shelfFile.keys()):
            del shelfFile[sys.argv[2]]
            print('"' + sys.argv[2] + '" has been deleted.')
        else:
            print('"' + sys.argv[2] + '" not found.')
elif len(sys.argv) == 2:
    # List keywords
    if sys.argv[1].lower() == 'list':
        print('\nAvailable keywords:\n')
        keywords = list(shelfFile.keys())
        for key in sorted(keywords):
            print(key)
    # Load content         
    elif sys.argv[1] in shelfFile:
        pyperclip.copy(shelfFile[sys.argv[1]])
    else:
        # Print usage error
        print('Usage:\n1. save <keyword>\n2. <keyword>\n' +
                '3. list\n4. delete <keyword>')
        sys.exit()

# close shelve file
shelfFile.close()

我已将此程序添加到我的路径中,并希望从我当前工作的任何目录中使用它。问题是 shelve.open() 在当前工作目录中创建了一个新文件。我怎样才能拥有一个持久目录?

【问题讨论】:

dbFile 使用绝对路径是一个开始。现在看起来不对,因为它是你所在位置的相对路径,以Users 开头,但看起来你确实想要/Users 【参考方案1】:

你的

dbFile = os.path.join('Users', 'dustin', 'Documents', 'repos', 'python', 'mcbdb')

会变成'Users/dustin/Documents/repos/python/mcbdb' 这样的东西,所以如果你从/Users/dustin/ 运行它,它会指向/Users/dustin/Users/dustin/Documents/repos/python/mcbdb,这可能不是你想要的。

如果您使用绝对路径,则以 /X:\(取决于操作系统)为根的内容将保留该“特定目录”。

我可能会推荐别的东西,使用~os.path.expanduser 获取用户的主目录:

dbFile = os.path.expanduser('~/.mcbdb')

【讨论】:

【参考方案2】:

3 年后,我偶然发现了同样的问题。 正如你所说的

shelfFile = shelve.open('fileName')

将架子文件保存到 cwd。根据您启动脚本的方式,cwd 会发生变化,因此文件可能会保存在不同的位置。

当然可以说

shelfFile = shelve.open('C:\an\absolute\path')

但如果将原始脚本移动到另一个目录,就会出现问题。

因此我想出了这个:

from pathlib import Path
shelfSavePath = Path(sys.argv[0]).parent / Path('filename')
shelfFile = shelve.open(fr'shelfSavePath')

这会将架子文件保存在 python 脚本所在的同一目录中。

解释:

在 Windows 上 sys.argv[0] 是脚本的完整路径名,可能看起来像这样:

C:\Users\path\to\script.py

Look here for documentation on sys.argv

在这个例子中

Path(sys.argv[0]).parent

会导致

C:\Users\path\to

我们使用 / 运算符将 Path('filename') 添加到其中。

因此这会给我们:

C:\Users\path\to\filename

因此无论脚本位于哪个目录,都将架子文件保存在与脚本相同的目录中。

Look here for documentation on pathlib

【讨论】:

以上是关于如何在特定目录中打开 python 搁置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在搁置中获取整数键?

无法打开 Python 搁置对象

如何在 Python 中使用 os.walk 获取特定文件或目录列表?

如何在Python中的目录中查找具有特定文件扩展名的所有文件

如何仅使用其扩展名打开文件?

如何在 TFS 中恢复覆盖搁置集?