Python: [错误 3] 系统找不到指定路径:

7
import os
Current_Directory = os.getcwd() # Should be ...\archive
CORPUS_PATHS = sorted([os.path.join("archive", directories) for directories in os.listdir(Current_Directory)])
filenames = []
for items in CORPUS_PATHS:
    filenames.append(sorted([os.path.join(CORPUS_PATHS, fn) for fn in os.listdir(items)]))

print filenames

我正在运行来自名为archive的文件的代码,在archive中有更多的文件夹,每个文件夹中都有一个或多个文本文件。我想制作一个包括每个文件夹路径的列表。但是出现了以下错误。

[Error 3] The system cannot find the path specified:

目前我有一个Python脚本,在与存档文件相同的文件夹中编写了这段代码,但会触发此错误。为了避免此错误并获取所有文件路径,我应该怎么做?

我对使用os不太熟练,并且并不经常使用它,所以如果这是一个简单的问题,我很抱歉。

编辑

import os
startpath = "archive"
corpus_path = sorted([os.path.join("archive/", directories) for directories in os.listdir(startpath)])

filenames = []
for items in corpus_path:
    print items
    path = [os.path.join(corpus_path, fn) for fn in os.listdir(items)]
    print path

我已经取得了一些进展,现在我的语料库路径基本上是一个包含所有所需文件夹路径的列表。现在我想要做的就是获取这些文件夹中所有文本文件的路径,但我仍然遇到问题,不知道如何解决错误,例如:

File "C:\Users\David\Anaconda\lib\ntpath.py", line 65, in join
result_drive, result_path = splitdrive(path)

File "C:\Users\David\Anaconda\lib\ntpath.py", line 116, in splitdrive
normp = p.replace(altsep, sep)

AttributeError: 'list' object has no attribute 'replace'

在这里查看答案:https://dev59.com/VGDVa4cB1Zd3GeqPbkO8 - GAVD
1个回答

6

您必须在Windows机器上运行。错误是由于os.listdir()。os.listdir()没有获取正确的路径。

而且在第3行,您正在执行os.path.join("archive", directories)。您应该加入完整的路径,包括驱动器(C:或D:),如“c:/archive/foo”或在Linux上,“home/root/archive/foo”

阅读 - Python os.path.join on Windows

os.path.join用法 -

在Windows上,当遇到绝对路径组件(例如r'\foo')时,驱动器号不会重置。 如果一个组件包含驱动器号,则所有先前的组件都将被丢弃,并且驱动器号将被重置。 请注意,由于每个驱动器都有一个当前目录,因此os.path.join("c:", "foo")表示相对于驱动器C:的当前目录的路径(c:foo),而不是c:\foo。

编辑:

您正在将列表corpus_path传递给第6行中的[os.path.join][2]。这会导致错误!请将corpus_path替换为items

我在我的'D:'驱动器中创建了一个存档文件夹。在存档文件夹下,我创建了3个文件夹foo1、foo2和foo3。每个文件夹都包含1或2个文本文件。然后我测试了您修改后的代码。代码工作正常。 以下是代码:

import os
startpath = "d:archive"
corpus_path = sorted([os.path.join("d:", "archive", directories) for directories in os.listdir(startpath)])

filenames = []
for items in corpus_path:
    print items
    path = [os.path.join(items, fn) for fn in os.listdir(items)]
    print path

输出:

d:archive\foo1
['d:archive\\foo1\\foo1.txt.txt', 'd:archive\\foo1\\foo11.txt']
d:archive\foo2
['d:archive\\foo2\\foo2.txt.txt']
d:archive\foo3
['d:archive\\foo3\\foo3.txt.txt']

问题在于,我想要的不是编写完整路径,而只是文件夹“archive”后面的部分。我的代码也会触发错误,因为我编写代码的实际Python脚本位于该目录中。因此,我认为我需要将其移出,但我不知道如何编辑我的代码以适应这种情况。 - David Yi
@DavidYi 如果你没有传递完整路径到 os.listdir()(第6行),那么它如何列出其中的目录呢?我有遗漏什么吗?归档文件夹位于驱动器(C:/ D:/ Home)中的其中一个内。在存档文件夹中有更多的文件夹,例如foo1、foo2和foo3。归档文件夹还包含Python脚本。在foo1、foo2和foo3中有文本文件。对吗? - Gaurav Vichare
是的,你说得对。但是会出现一个问题,因为代码假定Python脚本是另一个文件夹,所以无法找到"/archive/(python script)/..."。它会运行错误,所以我需要找到一种方法来忽略它。即使没有完整路径,我之前尝试过,当前目录是脚本运行的位置,部分路径可以访问我想要的文件夹。 - David Yi
1
@DavidYi 在你编辑的代码的第三行中删除“/”并尝试。因此,第3行将是corpus_path = sorted([os.path.join("archive", directories) for directories in os.listdir(startpath)]) - Gaurav Vichare
它仍然没有给我想要的结果。错误仍然会弹出。 - David Yi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接