如何检查路径/文件在 Python 中是否存在?



我在目录abc中有两个文件

test.py
hello.txt

文件test.py

import os.path
if os.path.exists('hello.txt'):
print('yes')
else:
print('no')

在同一目录中执行 test.py 时,正如我所期望的那样,输出为"是">

abc > python test.py
output: yes

但是当尝试从其他目录执行时

~ > python ~/Desktop/abc/test.py
output: no

如何纠正此问题

# the real case
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)

它在目录abc内执行时有效,但在目录外执行时失败。

谢谢大家,终于找到了解决方案,从没想过这很容易......只需更改工作目录,瞧🎉它的工作🙂🙂

import os
...
script_path = os.path.dirname(os.path.realpath(__file__))
os.chdir(script_path)
...
...

做一个完整的路径,蒂尔达

~

指定您"现在"的位置

要正确指定它,请执行完整路径。最简单的方法是转到文件资源管理器,右键单击该文件,然后按复制路径。这应该为您提供可以在任何地方指定的文件的完整路径。

如果这有帮助,请告诉我!

在这种情况下,您需要在浏览目录并读取内容后搜索文件。 您可以考虑os.scandir()遍历目录 [python 3.5]。 https://www.python.org/dev/peps/pep-0471/

样本:

def find_file(path: str) -> str:
for entry in scandir(path):
if entry.is_file() and entry.name == 'token.pickle':
return_path = f'{path}{entry.name}'
yield return_path
elif entry.is_dir():
yield from find_file(entry.path)
if __name__ == '__main__':
for path in find_file('.'):
with open(path, 'rb') as token:
creds = pickle.load(token)

好吧,如果您不知道完整的路径,恕我直言,这要困难得多。我没有任何好的,pythonic的想法来做到这一点!

要在整个PC中搜索文件,请使用子进程模块并在linux上执行"find"命令(您在Linux上,对吧?(,捕获输出,并询问您的文件是否在那里:

import subprocess
file_name = "test.txt"
sp = subprocess.Popen(["find", '/', "-name", file_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = sp.communicate()
found = False
for line in output:
if file_name.encode() in line:
found = True
print("Found:", found)

注意:要分隔搜索,请将"/"替换为您希望文件所在的父文件夹。

编辑:在Windows上,虽然我无法测试它,但命令将是:"dir/s/p hello.txt",因此子进程调用如下所示:sp = subprocess.Popen(["cmd", "/c", 'dir', '/s', '/p', 'Links'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我看到你已经在这里发布了你自己问题的答案

无论如何,我想建议你,没有必要在这里使用os.chdir(),只需这样做:

# the real case
path_to_your_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),"token.pickle")
if os.path.exists(path_to_your_file):
with open(path_to_your_file, 'rb') as token:
...

附言 如果您想知道,有几个很好的理由更喜欢使用os.path.join()而不是手动字符串连接,主要是它首先使您的编码平台独立

相关内容

  • 没有找到相关文章

最新更新