如何获取桌面位置?

48

我正在Windows上使用Python,我希望我的脚本可以将某个目录下的文件(我知道它的路径)复制到桌面。

我使用了这段代码:

shutil.copy(txtName, '%HOMEPATH%/desktop')
< p >当txtName是文本文件的名称(包括完整路径)时。

我遇到了错误:

IOError: [Errno 2] No such file or directory: '%HOMEPATH%/DESKTOP'

需要帮助吗?

我希望这个脚本可以在任何电脑上运行。


2
除了 GPCracker 之外,所有的答案都是错误的,因为桌面文件夹可以移动到 HOMEPATH 之外。 - andreymal
10个回答

63

在Unix或Linux上:

import os
desktop = os.path.join(os.path.join(os.path.expanduser('~')), 'Desktop') 

在Windows上:

import os
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop') 

并在你的命令中加入:

shutil.copy(txtName, desktop)

如果您认为这篇文章对您有帮助,或者解决了您的问题,@BenL 请投票支持或接受答案。 - user559633
你和上面的人都有很棒的回答。希望我能够接受你们两个。现在已经投了赞成票。谢谢! - Ben L
3
在Windows和Linux中,这似乎是有效的:os.path.expanduser("~/Desktop") - dashesy
4
不需要使用内部的os.path.join()调用。此外,第一个解决方案也适用于Windows:不需要第二个解决方案。 - Eric O. Lebigot
@ChauLoi 是的,我在 Mac 上测试过了,它会给你用户的父文件夹。 - Idhem
这在Windows 10上已不再可靠。桌面可能位于OneDrive中,可以是个人帐户或商业帐户。 - killjoy

36

这适用于Windows和Linux操作系统:

import os
desktop = os.path.expanduser("~/Desktop")

# the above is valid on Windows (after 7) but if you want it in os normalized form:
desktop = os.path.normpath(os.path.expanduser("~/Desktop"))

1
这在非英语的 Windows 机器上能行吗?当我回顾2010年左右的时候情况并非如此。 - Eric O. Lebigot
@EricLebigot 我没有非英语的Windows机器来测试,你能告诉我们吗? - dashesy
1
这将在Windows上产生'C:\\Users\\user/Desktop'... 这将适用于Win desktop = os.path.expanduser("~\\Desktop") - user9013730
1
@Sabrina,这是有效的,在较新的Windows中,您可以使用“/”,并且它更受欢迎,因为您不必转义它。如果您在意,可以使用os.path.normpath - dashesy
2
它可以在非英语(西班牙语)的计算机上运行,并且实际输出了Sabrina所说的内容。 - Javier
它在非英语的Linux机器上无法工作,因为我的桌面文件夹实际上是/home/andreymal/Рабочий стол - andreymal

32
你可以使用 os.environ["HOMEPATH"] 获取该路径。当前代码中的路径是字面量,尝试查找 %HOMEPATH%/Desktop 而没有替换实际路径。

也许可以改为:

shutil.copy(txtName, os.path.join(os.environ["HOMEPATH"], "Desktop"))

48
os.path.expanduser("~/Desktop") 在 Linux 和 Windows 上都可以使用,它的作用是将波浪号(~)扩展成当前用户的主目录路径。 - dashesy
2
@dashesy:你应该把它作为答案 - 它比其他任何答案都要好。 - Adrian Keister

30

对于3.5及以上版本,您可以使用pathlib:

import pathlib

desktop = pathlib.Path.home() / 'Desktop'

3
我的桌面不在C盘上,而且其他选项也不能直接工作。我喜欢这个解决方案! - TimeTravelPenguin
2
这似乎是现代化的做法。 - 101

14

我还不能发表评论,但是使用“Desktop”将位置连接到用户路径的解决方案有限,因为“Desktop”可能被重新映射到非系统驱动器。 要获取真实位置需要使用Windows注册表...或者通过ctypes使用特殊函数,如https://dev59.com/qXRB5IYBdhLWcg3wbGtB#626927


6

2
这个答案本质上是错误的:它只适用于Linux。 :) - johnson
真的 :) 我可能有点累了,忘记了关于Windows的那一部分。 - Salamandar

1

试试这个:

import os
file1 =os.environ["HOMEPATH"] + "\Desktop\myfile.txt" 

0

简单而优雅的方法,尝试使用以下代码访问桌面文件:

import os
import pathlib
import pandas as pd

desktop = pathlib.Path.home() / 'Desktop' / "Panda's" / 'data'
print(desktop) #check you path correct ?
data = pd.read_csv(os.path.joinn(desktop),'survey_results_public.csv')

祝贺您!


如果你整理一下你的答案(删除pandas / 打错字的os.path.joinn,因为括号放错位置而没有任何作用),你最终会得到一个重复的答案。 - johnson

0

这是对 @tpearse 的回答的补充:

在一个嵌入式环境中(C++程序调用Python环境)

os.path.join(os.environ["HOMEPATH"], "Desktop")

是唯一有效的方法。看起来

os.path.expanduser("~/Desktop")

对于嵌入式环境,它不能返回可用的路径(至少在我的环境中不行;但是在我的设置中,Visual Studio中可能缺少一些环境设置)


0
def get_desktop_path():
    import platform
    if platform.system() == 'Windows':
        try:
            import winreg
            reg_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
            desktop = winreg.QueryValueEx(reg_key, 'Desktop')[0]
            winreg.CloseKey(reg_key)
        except:
            desktop = "None"
    else:
        from pathlib import Path
        desktop = Path.home() / 'Desktop'
        if not os.path.exists(desktop):
            desktop = os.path.normpath(os.path.expanduser("~/Desktop"))
    if not os.path.exists(desktop):
        desktop = os.path.normpath(os.path.expanduser("~"))
        print(f"архив будет сохранен сюда: {desktop}")
    else:
        print(f"архив будет сохранен на рабочий стол")
    return desktop

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接