Python显示没有这样的文件或目录,尽管该文件存在错误

时间:2018-11-14 09:11:53

标签: python python-3.x

我想从多个文件中搜索字符串

我尝试过的事情:

import os
path= 'sample1/nvram2/logs' 
all_files=os.listdir(path) 
for my_file1 in all_files:
    print(my_file1)
    with open(my_file1, 'r') as my_file2:
        print(my_file2)
        for line in my_file2:
            if 'string' in line:
                print(my_file2)

输出:

C:\Users\user1\scripts>python search_string_3.py
abcd.txt
Traceback (most recent call last):
  File "search_string_3.py", line 6, in <module>
    with open(my_file1, 'r') as my_file2:
FileNotFoundError: [Errno 2] No such file or directory: 'abcd.txt'

但是C:\ Users \ user1 \ scripts \ sample1 \ nvram2 \ logs中存在文件abcd.txt

为什么错误显示没有这样的文件或目录?

使用glob:

当我使用all_files=glob.glob(path)而不是all_files=os.listdir(path)时显示以下错误

C:\Users\user1\scripts>python search_string_3.py
sample1/nvram2/logs
Traceback (most recent call last):
  File "search_string_3.py", line 7, in <module>
    with open(my_file1, 'r') as my_file2:
PermissionError: [Errno 13] Permission denied: 'sample1/nvram2/logs'

2 个答案:

答案 0 :(得分:1)

您发现/猜到了第一期。将目录与文件名连接即可解决该问题。 A classic

with open(os.path.join(path,my_file1), 'r') as my_file2:

如果您没有尝试使用glob做某事,我也不会愿意回答。现在:

for x in glob.glob(path):

由于path是目录,因此glob将其视为自身(您将获得一个包含一个元素的列表:[path])。您需要添加通配符:

for x in glob.glob(os.path.join(path,"*")):

glob的另一个问题是,如果目录(或模式)不匹配任何内容,则不会出现任何错误。它只是无能为力... os.listdir版本至少会崩溃。

并在打开之前(在两种情况下)测试它是否是文件,因为尝试打开目录会导致I / O异常:

if os.path.isfile(x):
  with open ...

简而言之,os.path包是您处理文件时的朋友。

答案 1 :(得分:-1)

由于文件abcd.txt位于C:\Users\user1\scripts\sample1\nvram2\logs中,并且所说的路径不是您的工作目录,因此您必须将其添加到sys.path

import os, sys
path= 'sample1/nvram2/logs'
sys.path.append(path)


all_files=os.listdir(path) 
for my_file1 in all_files:
    print(my_file1)
    with open(my_file1, 'r') as my_file2:
        print(my_file2)
        for line in my_file2:
            if 'string' in line:
                print(my_file2)