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.join
和 os.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无法读取或至少找不到文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章
错误:找不到要导入的文件或无法读取:fancy-buttons