端末を介してファイルを生成し、スクリプトpython3で2つのファイルをリンクします。

端末を介してファイルを生成し、スクリプトpython3で2つのファイルをリンクします。

"dir"という再帰ディレクトリがあります。ターミナルのLinuxでは、次のコマンドを使用してすべてのサブディレクトリのファイルのリストをCSVファイルに書き込みます。

dir$ find . -type f -printf '%f\n' > old_names.csv

ファイル名を変更するために復号化コードを使用しています。以下を使用して新しいリストを作成しています。

dir $ find . -type f -printf '%f\n' > new_names.csv

これをリストに結合し、次のように2つの列を持つ新しいリストを作成したいと思います。

ここに画像の説明を入力してください。

このために、2つのcsvファイルをpandasデータフレームとして読み込み、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)

問題は、Wrong file pair;というメッセージが表示されることです。

ここに画像の説明を入力してください。

new_names.csvを開いたときに、ファイルリストがold_namesリストとは異なる順序で作成され、インデックスを結合すると誤ったペアが発生することがわかりました。この問題をどのように解決できますか?

ベストアンサー1

このfindコマンドは、ソートや処理を行わずに、ファイルシステムで指定した順序でディレクトリエントリを出力します。使用しているファイルシステムやその他の要因によって、単一のファイルの名前を変更しても繰り返しの順序が変わる可能性がありますが、すべてのファイルを変更すると可能性が高くなります。厳密に制御された環境がない場合、2つのfindsが同じコマンドを発行する特別な理由はありません。

たとえば、多くの最新のファイルシステムは、名前を次の場所に保存します。ハッシュテーブル、項目が表示される順序で繰り返します。小さなファイル名の変更は、元のファイル名よりもテーブル内ではるかに前後に表示される可能性があり、ディレクトリ全体がハッシュされます。すべて移動する。この場合、ピースを再結合する現実的な方法はありません。

それ可能各ファイル名に変更されていない一意のプレフィックスがある場合は、sortファイル名を操作するのが役立ちますが、これは2回の実行で2つの別々のファイルを引き続き使用して実行できる唯一の現実的な後処理ですfind。私はこれを試すことをお勧めしません。


ただし、変更を印刷するオプションがdetoxあります(および変更を印刷できます)。-v-n会議する)。これを使用してCSVファイルを作成したり、次から直接使用することができます。Pythonの使い方subprocess.run

detox -v ... | sed -e 's/ -> /,/' > names.csv

1つ以上のファイルと同じCSVファイルが作成され、古いfind名前と新しい名前が自動的に一致します。 (以前と同様)デフォルト名の場合は%f後処理を実行する必要があり、必要に応じてPythonまたはシェルで実行できます。

おすすめ記事