Mi tarea es procesar las 3 categorías de archivos (cada uno tiene funciones diferentes en mi código original de Python) y al final del procesamiento de necesidad i para asignar el número de secuencia para ese archivo., Que está separado de esa categoría.
He intentado poner código de ejemplo de mi requisito, por favor me puede ayudar a sugerir la mejor manera de hacerlo.
Todos los archivos con la palabra clave 'Apple' terminarán con la numeración de secuencias por separado, y el mismo camino para otras dos categorías.
import shutil
Apple = 1
def AppleNum():
global Apple
Apple += 1
return str(Apple).zfill(3)
Banana = 1
def BananaNum():
global Banana
Banana += 1
return str(Banana).zfill(3)
Orange = 1
def OrangeNum():
global Orange
Orange += 1
return str(Orange).zfill(3)
def List_files(filepath, substr):
X = Y = []
for path, subdirs, files in sorted(os.walk(filepath), reverse=True):
for name in files:
X.append(os.path.join(path, name))
if substr == 'AAA':
return [str for str in Y if any(sub in str for sub in substr) and 'xml' in str]
elif substr == 'BBB':
return [str for str in Y if substr in str]
elif substr == 'CCC':
return [str for str in Y if substr in str and '.csv' in str]
else:
return ""
def copy_func():
for file in List_files(test_path, 'AAA'):
seq = AppleNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
for file in List_files(test_path, 'BBB'):
seq = BananaNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
for file in List_files(test_path, 'CCC'):
seq = OrangeNum()
shutil.copy(file, 'files/' +str(file) + _ + seq)
if __name__ == '__main__':
copy_func()
Please help if there is any other best approach to do this, because as per my new requirements 3 categories became 12.
Si los archivos de entrada son las siguientes ..
Apple_oo.xml
Banana_dsh
Apple_bb.xml
Orange.csv
Orange_dhj.csv
Orange_sk.csv
Banana_dhs
Resultados esperados después de asignar la numeración de secuencias:
Apple_oo.xml_2
Banana_dsh_2
Apple_bb.xml_3
Orange.csv_2
Orange_dhj.csv_3
Orange_sk.csv_4
Banana_dhs_3
Por favor, ayúdame con sugerencias ..
Gracias por adelantado.
Hacer un generador a la lista los nombres de los archivos filtrados, y utilizar enumerate
para crear números de índice para cada uno.
import shutil
import os
def filtered_files(path, filters):
""" List files in the path whose filenames contain the given string filters """
for p, subdirs, files in sorted(os.walk(path), reverse=True):
for name in files:
if all(f in name for f in filters):
yield os.path.join(p, name)
def make_numbered_copies(files, outfile="{name}_{index:03}", start=0):
for i, file in enumerate(files, start=start):
shutil.copy(file, outfile.format(name=file, index=i))
def main():
filter_groups = [("AAA", "xml"), ("BBB", ), ("CCC", ".csv")] # add more as needed
for filters in filter_groups:
files = filtered_files(path, filters)
make_numbered_copies(files, outfile="files/{name}_{index:03}", start=2)
if __name__ == '__main__':
main()
Puede que tenga que adaptar la filtered_files
función dependiendo de la complejidad de sus filtros son. Considere el uso de fnmatch
(por ejemplo fnmatch(name, "*AAA*.xml")
) o expresión regular para los filtros más complicados.