我在目录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()
而不是手动字符串连接,主要是它首先使您的编码平台独立