尽管文件存在,但是从Python找不到文件

时间:2018-04-24 11:20:30

标签: python file-io

我正在尝试将带有数字数组的简单文本文件加载到Python中。 MWE是

import numpy as np

BASE_FOLDER = 'C:\\path\\'
BASE_NAME = 'DATA.txt'
fname = BASE_FOLDER + BASE_NAME 

data = np.loadtxt(fname)

但是,这会在运行时出错:

OSError: C:\path\DATA.txt not found.

我正在使用VSCode,因此在调试窗口中可以单击指向路径的链接。当然,如果我点击它,文件会正常打开,所以这告诉我路径是正确的。

另外,如果我print(fname),VSCode也会给我一个有效的路径。

我有什么遗漏吗?

修改

根据你的(非常有用的未来参考)评论,我使用os模块和原始字符串更改了我的代码:

BASE_FOLDER = r'C:\path_to_folder'
BASE_NAME = r'filename_DATA.txt'
fname = os.path.join(BASE_FOLDER, BASE_NAME) 

仍然导致错误。

第二次编辑

我再次尝试使用其他文件。非常基本的路径和文件名

BASE_FOLDER = r'Z:\Data\Enzo\Waste_Code'
BASE_NAME = r'run3b.txt'

再次,我得到同样的错误。 如果我尝试另一种方法,

os.chdir(BASE_FOLDER)
a = os.listdir()

然后选择正确的文件,

fname = a[1]

尝试导入时仍然出错。即使我直接从listdir检索它。

>> os.path.isfile(a[1])
False

3 个答案:

答案 0 :(得分:3)

使用模块os,您可以通过运行

来检查python中是否存在该文件
import os
os.path.isfile(fname)

如果它返回False,则表示您的文件在指定的fname中不存在。如果它返回True,则应由np.loadtxt()读取。

额外:使用文件和路径的良好做法

使用文件时,建议使用基础库中内置的惊人功能,特别是模块os。无论您使用何种操作系统,os.path.join()都会处理连接。

fname = os.path.join(BASE_FOLDER, BASE_NAME)

此外,建议通过在字符串的开头添加r来使用原始字符串。在编写路径时,这将不那么繁琐,因为它允许您从导航栏进行复制粘贴。它将类似于BASE_FOLDER = r'C:\path'。请注意,您不需要添加最新的'\',因为os.path.join负责处理它。

答案 1 :(得分:0)

您可能没有读取下载文件的完全权限。使用

import numpy as np

a = np.random.normal(0,1,[1000,2])
b = np.random.uniform(0,1,[1000,2])

在命令提示符下,如果您使用的是Ubuntu,则授予自己读取权限。

答案 2 :(得分:0)

对我来说,问题是我在链接 (~/path/file) 中使用了 Linux 主页符号。用绝对路径 /home/user/etc_path/file 替换它就像魅力一样。