为什么在Python中找不到路径?

4 投票
1 回答
13011 浏览
提问于 2025-04-18 08:51

我正在尝试用Python打开一个已经存在的文件,如果我在命令行中用gedit打开它,效果很好。

但是,我遇到了以下错误信息:

andreas@ubuntu:~/Desktop/Thesis/Codes/ModifiedFiles$ python vis.py -f myoutputcsv.csv
Matplotlib version 1.3.1
Traceback (most recent call last):
  File "vis.py", line 1082, in <module>
    reliability_table = ReliabilityTable(reliability_table_file)
  File "vis.py", line 112, in __init__
    self.read(filename)
  File "vis.py", line 139, in read
    self.data = genfromtxt(filename, delimiter=',',comments='#', dtype=float)
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1344, in genfromtxt
    fhd = iter(np.lib._datasource.open(fname, 'rbU'))
  File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 147, in open
    return ds.open(path, mode)
  File "/usr/lib/python2.7/dist-packages/numpy/lib/_datasource.py", line 496, in open
    raise IOError("%s not found." % path)
IOError: ~/Desktop/Thesis/Codes/ModifiedFiles/reliability_table_2.csv not found.

你知道我可能哪里做错了吗?我对Python的经验很少,找不到为什么在命令行中可以打开文件,但用Python却不行的原因。

1 个回答

6

这个 ~(波浪号)是一个命令行扩展,而不是特别的“文件系统扩展”。

所以,~ 只有在命令行中时,才会直接扩展为当前用户的家目录:

$echo ~
/home/username

但是如果在传给 Python 文件对象的文件名中使用,就不会这样了。

这段 Python 代码:

open('some/file/name')

实际上就相当于在命令行中打开文件 'some/file/name',我说的就是带有单引号的那种,这样就不会进行扩展。

所以:

open('~/file.txt')

它尝试打开:

$echo '~/file.txt'
~/file.txt

而不是:

$echo ~/file.txt
/home/username/file.txt

这一点在 os.path 模块的文档开头也有说明:

与 Unix 命令行不同,Python 不会自动进行路径扩展。 当应用程序需要类似命令行的路径扩展时,可以显式调用 expanduser()expandvars() 函数。(还可以查看 glob 模块。)


实际上,你可以创建一个名为 ~ 的文件:

$touch '~'
$ls | grep '~'
~

这里需要用单引号,因为 touch ~ 会直接在 /home/username 上执行 touch,而不会创建文件。

现在如果你想删除这个文件,必须对它的名字进行转义,否则命令行会把它扩展成 /home/username

$echo ~
/home/username
$rm ~     # translation: "rm: cannot remove "/home/username": It's a directory"
rm: impossibile rimuovere "/home/username": È una directory
$rm '~'   # proper way to delete it

如果你想在文件名中扩展 ~,可以使用 os.path.expanduser 函数:

>>> import os.path
>>> os.path.expanduser('~/file.txt')
'/home/username/file.txt'

注意,realpathabspath 不会 扩展 ~

>>> os.path.realpath('~/file.txt')
'/home/username/~/file.txt'
>>> os.path.abspath('~/file.txt')
'/home/username/~/file.txt'

所以,如果你想确保将用户以“命令行语言”1 给出的路径转换为可以在 Python 文件对象中使用的绝对路径,你应该这样做:

os.path.abspath(os.path.expanduser(path))

1 这里不说 sh/bash,因为它们是跨平台的。

撰写回答