我想創建一個csv文件,其中包含2個由連接的路徑+文件名組成的列。第一列應包含Folder1的路徑+文件名,第二列應包含文件夾2的路徑+文件名。 這兩個操作應該是並行的。如何編寫一個csv文件,其中包含兩列,包括來自Python中兩個不同文件夾的路徑+文件名?
Col1中col2的
數據/ RGB/image_6_1.png,數據/後/深度/ image_6_0.png 該列表具有多個圖像。
名稱的排序應該是相似的。可能是zip函數會有幫助嗎?
我想創建一個csv文件,其中包含2個由連接的路徑+文件名組成的列。第一列應包含Folder1的路徑+文件名,第二列應包含文件夾2的路徑+文件名。 這兩個操作應該是並行的。如何編寫一個csv文件,其中包含兩列,包括來自Python中兩個不同文件夾的路徑+文件名?
Col1中col2的
數據/ RGB/image_6_1.png,數據/後/深度/ image_6_0.png 該列表具有多個圖像。
名稱的排序應該是相似的。可能是zip函數會有幫助嗎?
Python的izip_longest()
在這種情況下很有用。它會一次給你兩個列表中的元素。當一個列表用盡時(即另一個文件夾中有多個文件),它將默認返回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()
用於安全地串聯路徑組件連接在一起。
由於您的文件名包含數字,要進行數字排序,您需要拆分每個名稱,並在可能的情況下將結果字符串轉換爲整數。這會讓它按數字排序。
本示例是爲Python 2.x的
或者,如果不是使用自己的邏輯排序,你可以使用一個庫如natsorted
:
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
感謝馬丁它的工作原理。但是一個小問題。 此代碼中不保留名稱順序。 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
'listdir()'的輸出可以在傳遞給'izip_longest()'之前進行排序。不過就你而言,你的名字需要額外的努力來按照數字排序而不是按字母順序排序。 –
有關如何繼續操作的任何建議。如果我沒有對它進行排序,那麼csv文件的生成根本就沒有用處。 – Varun
請將代碼粘貼到問題本身中。 –