我想从多个文件中搜索字符串
我尝试过的事情:
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'
答案 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)