2017-08-23 4 views
0

パス+ファイル名を連結した2列のcsvファイルを作成します。最初の列にはFolder1のパス+ファイル名を、2列目にはFolder2のパス+ファイル名を含める必要があります。 両方の操作を並列にする必要があります。Pythonで2つの異なるフォルダのパス+ファイル名からなる2列のcsvファイルを書き込むにはどうすればよいですか?

のCol1 Col2に
データ/ RGB/image_6_1.png、データ/リア/深さ/ image_6_0.png リストは、複数の画像を有しています。

名前の順序は類似しているはずです。ジップ機能が役立つかもしれませんか?

+0

質問自体にコードを貼り付けてください。 –

答えて

0

この状況では、Pythonのizip_longest()が便利です。それはあなたに両方のリストから一度に1つの要素を与えるでしょう。 1つのリストが使い尽くされると(すなわち、1つのフォルダ内に他のフォルダがある場合)、空の要素に対してデフォルトでNoneが返されます。これを使用すると、各フォルダからそれをファイルのリストを渡すことができますし、次のようにPythonのcsvライブラリを使用してCSVファイルに書き込む:

from itertools import izip_longest 
import os 
import csv 


def numbers(x): 
    s = x.split('_') 
    output = [] 

    for v in s: 
     try: 
      output.append(int(v)) 
     except ValueError as e: 
      output.append(v) 

    return output 

folder1 = r"/my/folder1" 
folder2 = r"/my/folder2" 

with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 

    for f1, f2 in izip_longest(sorted(os.listdir(folder1), key=numbers), sorted(os.listdir(folder2), key=numbers)): 
     p1 = p2 = '' 

     if f1: 
      p1 = os.path.join(folder1, f1) 
     if f2: 
      p2 = os.path.join(folder2, f2) 

     csv_output.writerow([p1, p2]) 

os.path.join()を安全にパスコンポーネントを一緒に連結するために使用されます。

ファイル名に数字が含まれているため、数値でソートするには、各名前を分割し、結果の文字列リストを可能な限り整数に変換する必要があります。これにより数値的にソートされます。

この例では、むしろ、独自のロジックを使用して、それをソートするよりも、あなたがそのようなnatsortedとしてライブラリを使用することができれば、


代わりのPython 2.xのために設計されている:

from itertools import izip_longest 
from natsort import natsorted 
import os 
import csv 


folder1 = r"/my/folder1" 
folder2 = r"/my/folder2" 

with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 

    for f1, f2 in izip_longest(natsorted(os.listdir(folder1)), natsorted(os.listdir(folder2))): 
     p1 = p2 = '' 

     if f1: 
      p1 = os.path.join(folder1, f1) 
     if f2: 
      p2 = os.path.join(folder2, f2) 

     csv_output.writerow([p1, p2]) 

これは、することができます以下を使用してインストールしてください:

pip install natsorted 
+0

ありがとうマーティンそれは動作します。しかし、小さな問題です。 このコードでは、名前の順序は維持されません。 data/RGB/image_6_1.png、data/rear/depth/image_6_0.png のcsvを取得するdata/RGB/image_55_1.png、data/rear/depth/image22_0.png どちらも対応する必要があるかソートする必要があります。 – Varun

+0

'listdir()'の出力は、 'izip_longest()'に渡す前にソートすることができます。しかしあなたの場合、あなたの名前はアルファベット順ではなく数字でソートされるためにさらに努力する必要があります。 –

+0

それを進める方法に関する提案。私がそれをソートしなければ、csvファイルの生成はまったく役に立たないでしょう。 – Varun

関連する問題