Фильтрация определенных файлов в папке на основе списка - PullRequest
1 голос
/ 14 октября 2019

У меня есть папка с большим количеством файлов. Эти файлы сохраняются под отдельными именами. Я хочу извлечь файлы на основе списка имен. Наконец, эти извлеченные файлы должны быть сохранены в новой папке.

Я импортировал все файлы в определенной папке

list_files = [file[0] for file in list_files]

Ниже приведен список файлов в папке

['C:/A/results/fie_d_t_group_Jack.xlsx',
C:/A/results/fie_d_t_group_Bill.xlsx',
C:/A/results/fie_d_t_group_Cort.xlsx',
C:/A/results/fie_d_t_group_Niel.xlsx',
C:/A/results/fie_d_t_group_Van.xlsx',
C:/A/results/fie_d_t_group_Dick.xlsx',
C:/A/results/fie_d_t_group_Nick.xlsx']

Далее из моего фрейма данныхсоздал список с конкретными именами, которые я хочу отфильтровать

from pyspark.sql.functions import pow, col
import pyspark.sql.functions as f
data = [
    ('a', 2016,'Jack'),
    ('a', 2017,'Bill'),
    ('a', 2018,'Dat'),
  ('a', 2015,'Jane'),
  ('b', 2016,'Cort'),
    ('b', 2017,'Nick'),
    ('b', 2018,'Lam'),
  ('b', 2015,'Jane')

]
df = spark.createDataFrame(data, ["A", "B","C"])

name_list = list(df.select('C').toPandas()['C'])
name_list

Я хочу отфильтровать эти файлы из списка и сохранить эти файлы в новом месте. Извлеченные файлы должны быть в следующем списке

['C:/A/results/fie_d_t_group_Jack.xlsx',
C:/A/results/fie_d_t_group_Bill.xlsx',
C:/A/results/fie_d_t_group_Cort.xlsx',
C:/A/results/fie_d_t_group_Nick.xlsx']

Этот список файлов должен быть сохранен в новом месте.

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Вы можете легко сделать это с помощью следующей функции:

import re 

def filter_list(string, substr): 
    return [st for st in string if any(sub in st for sub in substr)] 

ls_1 = ['C:/A/results/fie_d_t_group_Jack.xlsx',
        'C:/A/results/fie_d_t_group_Bill.xlsx',
        'C:/A/results/fie_d_t_group_Cort.xlsx',
        'C:/A/results/fie_d_t_group_Niel.xlsx',
        'C:/A/results/fie_d_t_group_Van.xlsx',
        'C:/A/results/fie_d_t_group_Dick.xlsx',
        'C:/A/results/fie_d_t_group_Nick.xlsx']
ls_2 = ["Jack", "Bill", "Cort", "Nick"]

filter_list(ls_1, ls_2)
# ['C:/A/results/fie_d_t_group_Jack.xlsx', 
# 'C:/A/results/fie_d_t_group_Bill.xlsx', 
# 'C:/A/results/fie_d_t_group_Cort.xlsx', 
# 'C:/A/results/fie_d_t_group_Nick.xlsx']

Если вы хотите сохранить их в другом месте, теперь, когда у вас есть список файлов, которые вы хотите сохранить, вы можете просто переместитьих используя функцию shutil.move().

0 голосов
/ 14 октября 2019

Помимо хорошей логики, предоставляемой @pissall и @Axxelerated, вы также можете попробовать с inner join pyspark между извлеченными именами файлов и другим именем dataframe

import pyspark.sql.functions as f
from pyspark.sql import functions as F
from pyspark.sql import SparkSession


spark = SparkSession.builder.appName('test').master("local[*]").getOrCreate()

data = [
    ('a', 2016, 'Jack'),
    ('a', 2017, 'Bill'),
    ('a', 2018, 'Dat'),
    ('a', 2015, 'Jane'),
    ('b', 2016, 'Cort'),
    ('b', 2017, 'Nick'),
    ('b', 2018, 'Lam'),
    ('b', 2015, 'Jane')

]
df1 = spark.createDataFrame(data, ["A", "B", "C"])
df1.show()

df = spark.createDataFrame([('C:/A/results/fie_d_t_group_Jack.xlsx',),
                            ('C:/A/results/fie_d_t_group_Bill.xlsx',),
                            ('C:/A/results/fie_d_t_group_Cort.xlsx',),
                            ('C:/A/results/fie_d_t_group_Niel.xlsx',),
                            ('C:/A/results/fie_d_t_group_Van.xlsx',),
                            ('C:/A/results/fie_d_t_group_Dick.xlsx',),
                            ('C:/A/results/fie_d_t_group_Nick.xlsx',)],['filename'])

df.show(truncate=False)

df2 = df.withColumn('name', F.regexp_extract(df.filename, '.*_(\w+).xlsx', 1))

df2.show()

df2.join(df1, df1.C == df2.name, "inner").drop('name', 'A', 'B', 'C').show(truncate=False)
0 голосов
/ 14 октября 2019

Неясно, в каких именно точных требованиях вы хотите, чтобы файлы с соответствующими именами хранились в отдельном списке? Если требование заключается в том, что регулярное выражение можно просто использовать для сопоставления имен и получения нового списка.

import re
#your filenames
filenames=['C:/A/results/fie_d_t_group_Jack.xlsx',
'C:/A/results/fie_d_t_group_Bill.xlsx',
'C:/A/results/fie_d_t_group_Cort.xlsx',
'C:/A/results/fie_d_t_group_Niel.xlsx',
'C:/A/results/fie_d_t_group_Van.xlsx',
'C:/A/results/fie_d_t_group_Dick.xlsx',
'C:/A/results/fie_d_t_group_Nick.xlsx']
#your names
data = [
    ('a', 2016,'Jack'),
    ('a', 2017,'Bill'),
    ('a', 2018,'Dat'),
  ('a', 2015,'Jane'),
  ('b', 2016,'Cort'),
    ('b', 2017,'Nick'),
    ('b', 2018,'Lam'),
  ('b', 2015,'Jane')
]
#matching names
result=[]

for i in filenames:
    name=re.findall("C:/A/results/fie_d_t_group_(.*).xlsx",i)[0]
    if name in [i[2] for i in data]:
        result.append(i)

print(result)

Результат, который я получил:

['C:/A/results/fie_d_t_group_Jack.xlsx', 'C:/A/results/fie_d_t_group_Bill.xlsx', 'C:/A/results/fie_d_t_group_Cort.xlsx', 'C:/A/results/fie_d_t_group_Nick.xlsx']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...