如何打开特定目录中的 python 搁置文件
How can I open a python shelve file in a specific directory
我正在研究 Ch. "Automate the Boring Stuff With Python" 中的 8 个正在尝试扩展 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 = 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 依赖)将保留 "specific directory".
我可能会推荐其他东西,使用 ~
和 os.path.expanduser
:
获取用户的主目录
dbFile = os.path.expanduser('~/.mcbdb')
3 年后,我偶然发现了同样的问题。
正如你所说
shelfFile = shelve.open('fileName')
将shelf文件保存到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}')
这会将 shelf 文件保存在 python 脚本所在的同一目录中。
解释:
On 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
因此无论脚本在哪个目录中,始终将 shelf 文件保存在与脚本相同的目录中。
我正在研究 Ch. "Automate the Boring Stuff With Python" 中的 8 个正在尝试扩展 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 = 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 依赖)将保留 "specific directory".
我可能会推荐其他东西,使用 ~
和 os.path.expanduser
:
dbFile = os.path.expanduser('~/.mcbdb')
3 年后,我偶然发现了同样的问题。 正如你所说
shelfFile = shelve.open('fileName')
将shelf文件保存到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}')
这会将 shelf 文件保存在 python 脚本所在的同一目录中。
解释:
On 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
因此无论脚本在哪个目录中,始终将 shelf 文件保存在与脚本相同的目录中。