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的文件中运行此代码,在存档中有更多文件夹,并且在每个文件夹中都有一个或多个文本文件。我想创建一个列表,其中包含每个文件夹的路径。但是会出现以下错误。
[Error 3] The system cannot find the path specified:
我目前有python脚本,我将此代码写在与archive相同的文件夹中,它将触发此错误。我该怎么做才能阻止此错误并获取所有文件路径。
我使用操作系统非常糟糕,我不经常使用它,所以如果这是一个微不足道的问题我会道歉。
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'
答案 0 :(得分:2)
你必须在Windows机器上。错误是因为os.listdir()。 os.listdir()没有得到正确的路径。
在第3行,您正在执行os.path.join(" archive",目录)。 你应该加入完整的路径,包括驱动器(C:或D :),如" c:/ archive / foo:或在linux上 "家用/根/存档/富"
阅读 - Python os.path.join on Windows
在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']