【问题标题】:Why path is not found in python?为什么在python中找不到路径?
【发布时间】:2014-07-27 15:28:06
【问题描述】:

我正在尝试使用 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 的原因。

【问题讨论】:

  • 您的命令行显示myoutputcsv.csv,而错误显示为reliability_table_2.csv。您是否在vis.py 中硬编码了错误的名称? vis.py到底是什么内容?
  • 也许某些东西需要绝对路径?与vis.py在同一目录下的reliability_table_2.csv吗?
  • 不,这两个文件不同。 vis.py和reliability_table_2.csv不在同一个目录下,但是都在我家目录下的文件夹中
  • @dusty 是的,非常感谢。它需要一个绝对路径。

标签: python python-2.7 numpy matplotlib ioexception


【解决方案1】:

~(波浪号)是 shell 扩展,而不是特殊的“文件系统扩展”。 所以~在shell命令中找到时直接扩展到当前用户:

$echo ~
/home/username

但如果在传递给 python 文件对象的文件名中使用,则不会。 python代码:

open('some/file/name')

相当于在shell中打开文件'some/file/name',我的意思是字面意思包含防止扩展的单引号。

所以:

open('~/file.txt')

尝试打开:

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

而不是:

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

os.path 模块的文档顶部也说明了这一点:

与 unix shell 不同,Python 不进行任何自动路径扩展。 可以调用expanduser()expandvars()等函数 当应用程序需要类似 shell 的路径扩展时明确表示。 (看 也是glob 模块。)


其实你可以创建一个名为~的文件:

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

单引号是必需的,因为touch ~ 只会在/home/username 上执行touch 并且不会创建文件。

现在如果你想删除它,你必须转义它的名字,否则shell会把它扩展成/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'

因此,如果您想确保将用户以“shell 语言”1 提供的路径名转换为可用于 python 文件对象的绝对路径,您应该这样做:

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

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

【讨论】:

  • 非常感谢巴卡留!!!是的,这正是我所做的:) 很好的答案!
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 2017-03-07
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多