【问题标题】:Python :[Error 3] The system cannot find the path specified:Python:[错误3]系统找不到指定的路径:
【发布时间】:2015-11-28 17:33:22
【问题描述】:
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'

【问题讨论】:

标签: python windows operating-system


【解决方案1】:

您必须在 Windows 机器上。错误是因为 os.listdir()。 os.listdir() 没有得到正确的路径。

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

阅读 - Python os.path.join on Windows

os.path.join Usage -

在 Windows 上,绝对路径不会重置驱动器号 遇到组件(例如,r'\foo')。如果一个组件包含一个 驱动器号,所有以前的组件都被扔掉了,驱动器 信被重置。请注意,由于每个目录都有一个当前目录 drive, os.path.join("c:", "foo") 表示相对于 驱动器 C: (c:foo) 上的当前目录,而不是 c:\foo。

编辑:

您在第 6 行将列表 corpus_path 传递给 [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']

【讨论】:

  • 问题是我的目标不是写一个完整的路径,而只是文件夹存档之后的一部分。我的代码也会触发错误,因为我编写代码的实际 python 脚本位于该目录中。所以我假设我需要将它移出,但我不知道如何编辑我的代码以适应它。
  • @DavidYi 如果你没有将完整路径传递给os.listdir()(第6行),那么它将如何列出它下面的目录?我错过了什么?存档文件夹是insdie驱动器之一(C:/D:/Home)。文件夹存档内有更多文件夹,例如 foo1、foo2 和 foo3。存档文件夹还包含 python 脚本。在 foo1、foo2 和 foo3 里面有文本文件。对吗?
  • 是的,你说的是对的。但是会出现一个问题,即 /archive/(python script)/... 将找不到,因为代码假设 python 脚本是另一个文件夹。它会运行一个错误,所以我需要找到一种方法让它被忽略。同样,即使没有完整路径,我之前也尝试过,当前目录是运行脚本的位置,部分制作的路径可以访问我想要的文件夹。
  • @DavidYi 从您编辑的代码的第 3 行中删除“/”并尝试。所以第 3 行将是 corpus_path = sorted([os.path.join("archive", directories) for directories in os.listdir(startpath)])
  • 它仍然没有给我想要的东西。仍然会弹出错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2020-06-24
  • 1970-01-01
  • 2020-05-27
  • 2017-02-05
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多