为什么在Python中找不到路径?
我正在尝试用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'
注意,realpath
和 abspath
不会 扩展 ~
:
>>> 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
,因为它们是跨平台的。