Python3无法读取或至少找不到文件[重复]

Posted

技术标签:

【中文标题】Python3无法读取或至少找不到文件[重复]【英文标题】:Python3 can't read or at least find file [duplicate] 【发布时间】:2021-03-12 16:56:51 【问题描述】:

我正在使用 python3+,但无法让它读取 git repo 本地的文件

输出

pyyaml version = 5.3.1
Whoops! Can't find config.yml file --- exiting

Process finished with exit code 1

文件权限

-rw-r--r-- 1 pi pi  270 Nov 29 18:55 config.yml
drwxr-xr-x 8 pi pi 4096 Nov 30 12:54 .git
drwxr-xr-x 3 pi pi 4096 Nov 30 13:00 .idea
-rw-r--r-- 1 pi pi  447 Nov 30 13:19 main.py

应用代码

import requests
import yaml
import sys
from bs4 import BeautifulSoup


ymlversion = yaml.__version__
print("pyyaml version = " + ymlversion)


try:
    open("config.yml")
except FileNotFoundError:
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')

# open the yaml file and load it into data
with open("config.yml", "r") as yamlfile:
    data = yaml.load(yamlfile, Loader=yaml.FullLoader)
    print("Read successful")
print(data)

【问题讨论】:

您是否从 Git 目录运行脚本? 当您注释掉try 块并运行with 块时会发生什么? 请记住,config.yal 与您当前的 工作 目录相关,不一定是 main.py 所在的目录。 如果您的第一个open 成功,您将不会关闭它,因此一旦您的代码找到该文件,您将打开该文件两次。我建议您使用os.path.isfile() 检查文件是否存在。您可能想要执行print(os.getcwd()) 以查看您当前的目录是什么,这样您就知道 Python 在哪个目录中查找您的输入文件。 【参考方案1】:

config.yml 是从当前工作目录中读取的,也就是您运行它的目录。所以,要么从目录运行脚本,要么使用__file__(脚本文件的路径)和os.chdir来改变你的cwd:

import os

os.chdir(os.path.dirname(__file__))

您也可以从路径os.path.join(os.path.dirname(__file__), "config.yml")读取文件。

os.path.joinos.path.dirname 是路径操作函数,它们只是将路径连接在一起并分别获取它们的目录名称。

【讨论】:

你应该解释__file__是什么,以及你的代码在做什么。【参考方案2】:

如果 yaml 文件总是在 python 文件旁边,你应该对其进行编码:

import os
import yaml
import sys
from bs4 import BeautifulSoup

SCRIPTDIR = os.path.dirname(__file__)
YAMLFILE = os.path.join(SCRIPTDIR, 'config.yaml')

ymlversion = yaml.__version__
print("pyyaml version = " + ymlversion)

# Old way to check if file exists:
'''
try:
    open(YAMLFILE)
except FileNotFoundError:
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')
'''

# Better way to check if file exists:
if not os.path.exists(YAMLFILE):
    sys.exit('Whoops! Can\'t find config.yml file --- exiting')

# open the yaml file and load it into data
with open(YAMLFILE, "r") as yamlfile:
    data = yaml.load(yamlfile, Loader=yaml.FullLoader)
    print("Read successful")
print(data)

【讨论】:

我建议您将第一个 open 更改为 os.path.exists(),否则会导致文件句柄泄漏。您可以向 OP 展示如何避免这种情况以及 try/catch。

以上是关于Python3无法读取或至少找不到文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自己编译的Python找不到numpy怎么办

错误:找不到要导入的文件或无法读取:fancy-buttons

找不到或无法读取要导入的文件:指南针

vscode下运行c++找不到头文件是怎么回事

找不到或无法读取要导入的 Angular CLI SCSS 文件

错误:找不到要导入的文件或无法读取:引导电子邮件