Eu tenho um diretório recursivo chamado 'dir'. Estou escrevendo a lista de arquivos de todos os subdiretórios para um arquivo CSV com o seguinte comando no linux no terminal.
dir$ find . -type f -printf '%f\n' > old_names.csv
Estou usando um código de desintoxicação para alterar os nomes dos arquivos. E estou fazendo uma nova lista usando
dir $ find . -type f -printf '%f\n' > new_names.csv
Eu gostaria de juntar isso a listas e fazer uma nova lista com duas colunas mais ou menos assim;
Para fazer isso, leio os dois arquivos csv no quadro de dados do pandas e os uno no índice da seguinte maneira no script python3
import pandas as pd
import csv
df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
df_names=df_new.join(df_old)
O problema é que estou recebendo algo assim, pares de arquivos errados;
Quando abro o new_names.csv, vejo que a lista de arquivos está escrita em uma ordem diferente da lista old_names, portanto, juntando-se ao índice, resultando em pares errados. Como posso resolver este problema?
O
find
comando apenas sai na ordem em que o sistema de arquivos fornece suas entradas de diretório, sem qualquer classificação ou processamento. Dependendo do sistema de arquivos que você está usando e de outros fatores, renomear até mesmo um único arquivo pode alterar a ordem de iteração, mas alterar todos eles provavelmente fará isso. Sem um ambiente rigidamente controlado, não há nenhuma razão específica para que doisfind
s devam dar a mesma ordem assim.Por exemplo, muitos sistemas de arquivos modernos armazenam nomes em uma tabela de hash e iteram nas entradas de ordem que aparecem lá. Uma pequena alteração no nome do arquivo pode ser muito anterior ou posterior na tabela do que o original, ou até mesmo causar re-hashing total de todo o diretório para que tudo se mova. Não há uma maneira realista de juntar as peças nesse caso.
É possível que
sort
escrever os nomes dos arquivos possa ajudar, se cada um deles tiver um prefixo único e inalterado, mas esse é o único tipo realista de pós-processamento que você pode fazer e continuar com dois arquivos separados de duasfind
execuções. Não recomendo nem tentar isso.No entanto,
detox
tem uma-v
opção que imprime as alterações que está fazendo (e-n
para imprimir o que faria ). Você pode usar isso para produzir seu arquivo CSV ou diretamente do Python usandosubprocess.run
.produziria um arquivo CSV pelo menos tão bem quanto um de seus
find
s, com os nomes antigos e novos automaticamente combinados. Para os nomes de base (como%f
did), você precisará pós-processar, o que pode ser feito em Python, se necessário, ou no shell.