Мне нужно сравнить папку S3, если какая-либо из них содержит имя файла с таким же содержимым, как config.file_pattern в таблице снежинок:
У меня есть таблица (таблица конфигурации) в снежинке, в которой хранится столбец с именем файл_шаблон, который имеет такие значения, как «.имя_файла_шаблон.csv». (Это похоже на карту while в SQL до и после *, она может иметь любое значение). У него есть и другие форматы файлов, такие как .txt, .xls, поэтому я хочу сказать, что CSV не является постоянным значением. Мне нужно сравнить этот файл_шаблон со списком файлов корзины S3 и посмотреть, есть ли в папке что-нибудь, что соответствует файл_шаблон.
Выберите file_pattern из Config ;
файл_шаблон |
---|
.*file_name_pattern1*.csv |
.*file_name_pattern2*.txt |
.*file_name_pattern3*.png |
ниже пример структуры папок S3
DIR1/DIR2/DIR3/DIR4/file_name_pattern1_20190904.CSV
###Вопрос :###
как сравнить это поле подстановочного знака в столбце снежинки файл_шаблон с папкой S3. Сложность в том, что при сравнении я должен также учитывать .csv, а не только файл_шаблон.
Я попытался разделить запись с * на * в " *file_name_pattern*.csv" , опять же, это не будет учитывать .csv в конце
File_Pattern = [.*file_name_pattern1*.csv , .*file_name_pattern2*.pgp, *File_name_pattern.*.txt]
item['Key'] = DIR1/DIR2/DIR3/DIR4/file_name_pattern_20190904.CSV (это результат списка папок/файлов s3. Я получил его, подключившись к S3 с помощью boto3)
Ниже приведена первоначальная версия, которую я пробовал, которая, очевидно, не работала, поскольку сравнивалась один к одному.
for file in File_Pattern :
if file in item['Key']:
"Run a query"
Попробуйте 2:
for file in File_Pattern :
file_1 = file.split('*') #(result was like [.,file_name_pattern1,.csv]
if file_1[1] in item['Key']:
"Run a query"
В этом мне не хватало .csv, если я сравниваю только file_1[1]
Я не уверен, как справиться с этим
Я отредактировал, чтобы лучше понять.
пожалуйста, отформатируйте код.
Я не уверен, что понимаю точную проблему, но похоже, что наличие '*' в шаблоне файла вас сбивает с толку.
Я думаю, что вы на правильном пути. В любом случае может работать игнорирование «' поскольку оператор in
будет искать этот сегмент между '» и фокусировка на конце файла (т. е. тип файла, .csv, .txt).
Предприняв вторую попытку, вы можете, например, немного изменить его, чтобы добавить второе условие для учета расширения:
file_1 = file.split('*') #(result was like [.,file_name_pattern1,.csv]
if file_1[1] in item['Key'] and file_1[-1] == item['Key'][-4:]:
здесь вы просите, чтобы шаблон и расширение совпадали.
file_1[-1]
будет «.csv», «.txt» и т. д., т. е. часть расширения, которая будет последним элементом результата разделения.
item['Key'][-4:]
даст вам последние 4 буквы.
Можете попробовать перефразировать и уточнить свой вопрос. Может быть, привести лучшие примеры, чтобы их было легче понять?