Как читать файлы из двух папок и избегать дубликатов в Python - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующие папки, из которых я читаю файлы SQL и сохраняю их как переменные:

++folder1
  -1.sql
  -2.sql
  -3.sql
++folder2
  -2.sql

Следующий код хорошо работает для одной папки.Как я могу изменить этот код так, чтобы он читал не только из одной папки, но и из двух, с правилом, согласно которому, если файл существует в папке 2, чем не читать файл с тем же именем из папки 1?

folder1 = '../folder1/'
for filename in os.listdir(folder1):
    path = os.path.join(folder1, filename)
    if os.path.isdir(path):
        continue
    with open(folder1 + filename, 'r') as myfile:
        data = myfile.read()
    query_name = filename.replace(".sql", "")
    exec (query_name + " = data")

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Ответ на этот вопрос прост: выполните два listdir вызова, затем пропустите файлы в папке 1, которые также находятся в папке 2.

Один из способов сделать это с помощью операций над множествами: разность множеств a - b означает все элементы в a, которые также не входят в b, и это именно то, что вам нужно.

files1 = set(os.listdir(folder1))
files2 = set(os.listdir(folder2))
files1 -= files2

paths1 = [os.path.join(folder1, file) for file in files1]
paths2 = [os.path.join(folder2, file) for file in files2]
for path in paths1 + paths2:
    if os.path.isdir(path):
        # etc.

В качестве примечания, динамически создаем группу переменных, подобных этойпочти всегда очень плохая идея, и делать это с exec вместо globals или setattr - еще хуже.Обычно лучше хранить все, например, в диктовке.Например:

queries = {}
for path in paths1 + paths2:
    if os.path.isdir(path):
        continue
    name = os.path.splitext(os.path.basename(path))[0]
    with open(path) as f:
        queries[name] = f.read()
0 голосов
/ 31 мая 2018

Вы можете попробовать что-то вроде следующего:

folders = ['../folder2/','../folder1/']
checked =[]
for folder in folders:
    for filename in os.listdir(folder):
        if filename not in checked:
            checked.append(filename)
            path = os.path.join(folder, filename)
            if os.path.isdir(path):
                continue
            with open(folder + filename, 'r') as myfile:
                data = myfile.read()
            query_name = filename.replace(".sql", "")
            exec (query_name + " = data")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...