简体   繁体   中英

How to open files when subdirs name and file names match

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

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())

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))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM