I have file structure like this
\dir1
\subdir1
-file1.txt
-file2.txt
\subdir3
-file2.txt
\dir2
\subdir1
-file1.txt
\subdir2
-file2.txt
I want to use dir1
as reference directory and open file in dir2
when dir2
subdirs
names match to that one in dir1
. So basically open file1.txt
in both \dir1\subdir1\file1.txt
and \dir2\subdir1\file1.txt
and also match the file names as well.
I can walk through the subdirs
but cannot find the logic to compare them
for path, subdirs, files in os.walk(path_to_json) :
for file in subdirs :
print (file)
How can we do this ?
how to open files that match a pattern in a subdirectory
CodePudding user response:
You can create a path simply by replacing dir1 with dir2 and if there is such a file, then open both files.
import os
path = r"C:....dir1"
files_dir1 = []
# We make a list of all files in the directory dir1.
for root, dirs, files in os.walk(path):
for file in files:
files_dir1.append(os.path.join(root, file))
for name in files_dir1:
name_dir2 = name.replace('dir1', 'dir2', 1)
# Open files when a file with a new path exists.
if os.path.isfile(name_dir2):
with open(name, 'r') as f:
print(name, f.read())
with open(name_dir2, 'r') as f:
print(name_dir2, f.read())
CodePudding user response:
You could try something like this:
from pathlib import Path
for file_1 in Path('dir1').rglob('*.*'):
file_2 = Path('dir2', *file_1.parts[1:])
if file_2.exists():
print(str(file_1))
print(str(file_2))
If you only want to go for txt
-files then change .rglob('*.*')
to .rglob('*.txt')
. When there are files without an extension you could do:
for file_1 in Path('dir1').rglob('*'):
if file_1.is_dir():
continue
file_2 = Path('dir2', *file_1.parts[1:])
if file_2.exists():
print(str(file_1))
print(str(file_2))
If you only want the files from the first sublevel (exactly one subdir-depth) then you could try:
for file_1 in Path('dir1').glob('*/*.*'):
file_2 = Path('dir2', *file_1.parts[1:])
if file_2.exists():
print(str(file_1))
print(str(file_2))