22

我正在构建一个基本文件服务器,但我的程序找不到文件。

def sendfile(sock, myfile):
    print 'Serving file:', myfile
    print 'File exists?:', os.path.exists(myfile)

    path = os.path.normpath(os.path.join(os.getcwd(), myfile))
    print 'Serving file:', path
    print 'File exists?:', os.path.exists(path)

即使 'myfile' 和 'path' 是正确的 [文件与服务器程序位于同一目录中],这些总是返回 False。

IDLE 工作正常,但没有传递给函数。

>>> print os.path.exists("/user/server/foo.txt")  
True

我错过了什么?

[编辑:] 输出:

Serving file: foo.txt

File exists?: False
Serving file: /user/server/foo.txt

File exists?: False
4

10 回答 10

23

在检查路径是否存在之前,我几乎 100% 确定您没有清理您的输入。这是我在解释器中运行的内容:

>>> from os.path import exists
>>> exists('dog.png')
True
>>> exists('dog.png\n')
False

path在检查它是否存在之前尝试去除空格。

于 2012-09-26T20:30:42.930 回答
10

如果您阅读os.path.exists()的 Python 文档,它会说在某些特定情况下文件或文件夹存在但os.path.exists()返回 false:

如果 path 引用现有路径或打开的文件描述符,则返回 True。对于损坏的符号链接返回 False。在某些平台上,如果未授予对请求的文件执行 os.stat() 的权限,即使路径物理存在,此函数也可能返回 False。

于 2017-09-08T23:13:39.310 回答
7

没有直接回答这里所说的问题,但是当 os.path.exists() 一直给我“False”时,我发现了这个话题,即使在使用 strip() 或 os.path.join() 之后也是如此。就我而言,我使用 ~ (tylda) 指向主目录,如下所示:

fileName = "~/path/to/file.txt"

解决此问题的最佳方法是使用os.path.expanduser(fileName),然后检查文件是否存在。或者使用 os.path.abspath() 恢复绝对路径,然后从路径中删除“~”(但此解决方案不适用于所有情况)。

os.path.exists(os.path.abspath(fileName).replace("~",""))

也许这会对某人有所帮助。

于 2020-01-23T22:44:39.597 回答
3

正如在这个答案中所说, 这主要发生在空白处。

我也遇到过这个问题。我花了很多时间才弄清楚这一点。

python 有一个称为strip()删除空格的函数。

如果变量path_to_file包含实际文件的路径,则尝试使用

if path.exists(path_to_file.strip())
        print("file exists")
else:
        print("file doesn't exist")

这对我有用。

于 2019-10-02T13:13:55.703 回答
2

这可能无法直接回答您的问题,但您可以使用“try/except”方法:如果文件不存在(特别是如果它是内置函数),则使用该文件的任何函数都应返回异常,并且您可以采取相应的行动。那么你就不用自己去检查文件是否存在了。危险的?也许吧,但这取决于你实际上想要做什么。

于 2012-09-26T20:23:45.870 回答
1

如果由于空格而失败,老实说这应该被认为是一个错误。

我发现在某些情况下,结果会是虚假的,这取决于文件服务器的状态。这种情况不会一直发生,只会偶尔发生一次。

我发现至少有 10 秒的延迟,我可以避免失败。在这种情况下,我会反复打开 zip 存档以访问特定的压缩文件。在尝试打开它之前,它会检查路径是否存在(由于这个奇怪的问题,请尝试在下面使用)。如果它失败了,那么它会在一个循环中等待,延迟会增加。我发现它通常会在 4 个循环(10 秒延迟)后再次发现文件存在。

这是我的循环打印语句的输出:

Archive r:\ballotimagearchive\ca_san_francisco_2020_pri\d03.zip does not exist according to os.path.exists().
Waiting 1 seconds
Waiting 2 seconds
Waiting 3 seconds
Waiting 4 seconds
After wait of 10 secs, r:\ballotimagearchive\ca_san_francisco_2020_pri\d03.zip now exists according to os.path.exists().

以及产生这个的代码段。

    if os.path.isfile(source_path):
    print(f"Verified that {source_path} exists.")
else:
    print(f"Archive {source_path} does not exist according to os.path.exists().")

    # this may be a spurious problem related to using a file server.

    tot_time = 0
    for i in range(1,20):
        print(f"Waiting {i} seconds")
        time.sleep(i)
        tot_time += i 
        if os.path.isfile(source_path):
            print(f"After wait of {tot_time} secs, {source_path} now exists according to os.path.exists().")
            break
    else:
        print(f"After wait of {tot_time} secs, {source_path} still not found according to os.path.exists().")
        sys.exit(1)
于 2020-05-26T03:34:02.267 回答
1

如果给定路径长于 256 个字符,os.path.exists 也会返回 false。

于 2021-09-21T07:37:24.860 回答
0

我遇到了同样的问题,并找到了以下解决方案:

即使在 Windows 上使用操作系统的本机目录分隔符“\”或“/”,在所有场合使用正斜杠对我来说都很好。os.sep 可以提供帮助。

除此之外,清理路径字符串有点类似于:

import re
from os import path
strPath = "c:/dir1/dir2/dir3/dir4/important-file.ext"
strPath = re.escape(strPath)

bTest = os.access(strPath, os.F_OK)

# or the classic
bTest = path.exists(strPath)
print(bTest)


于 2020-05-29T14:55:45.343 回答
0

我想使用Downloadsubuntu上文件夹中的文件,但是os.path.exists找不到使用绝对路径~/Downloads/filename.txt

然后我os.path.abspath('')用来获取根路径/home/yourPCname/并替换~,它的工作原理!

于 2020-06-24T07:47:51.623 回答
0

在我尝试添加 getcwd() 之前,我经常遇到这个问题,现在它永远不会失败

os.path.join(os.getcwd(), source_file)
于 2022-01-20T00:42:46.257 回答