2017-10-09 120 views
-2

的一部分,我有我的文件夾中的這些圖片:只更改文件名

  • area11.tif
  • area12.tif
  • area14.tif
  • area21.tif
  • area22.tif
  • area25.tif

how ca ñ我只更改最後一位數字,以便它們變得有序並且「更多增量」? 相反,如果area14.tif它應該是area13.tif和area22/area25相同的東西。

我有一個代碼,但它有點破,因爲它刪除了一些文件(這很奇怪,我知道...)。

編輯:添加(也許破..)代碼

try: 
    path = (os.path.expanduser('~\\FOLDER\\')) 
    files = os.listdir(path) 

    idx = 0 
    for file in files: 
     idx =+ 1 
     i = 'ex_area' 
     if file.endswith('.tif'): 
      i = i + str(idx) 
      os.rename(os.path.join(path, file), os.path.join(path, str(i) + '.tif')) 
except OSError as e: 
    if e.errno != errno.EEXIST: 
     raise 
+0

爲什麼你在意?你不能只用glob嗎? – cwallenpoole

+0

我很在意,因爲我需要他們爲此後的流程訂購。 現在我正在閱讀有關正則表達式的東西..可能是這樣嗎? – Link

+0

哪部分你有麻煩?一般重命名文件還是特別按順序編號? – Mark

回答

2

1)閱讀目錄中的文件名到數組(串)。
2)迭代文件名
3)對於每一個文件名的陣列上方,片串和插入索引
4)重命名

例如:

import os 
import glob 

[os.rename(n, "{}{}.tif".format(n[:5], i)) for i, n in enumerate(glob.glob("area*"))] 
+0

我試着在後來實際使用生成的列表時嘗試理解。 –

+1

@DavisHerring爲了便於閱讀而更新。謝謝 –

+0

@ VladLyga它只增加area2的最後一位數字。也許我做錯了什麼..現在雙重檢查.. – Link

1

首先你獲得的列表中圖像pathes使用glob模塊:

images = glob.glob("/sample/*.tif") 

那麼你只需要重新命名他們都與操作系統模塊:

for i in range(len(images)): os.rename(images[i], ‘area’+i+’.tif’) 
+0

最後一位數字是以這種方式增加的嗎? – Link

+1

首選'enumerate'到'len(range(...))'。 –

+0

@Link請用最後一位數字遞增來檢查我的答案。 –

1

首先重命名所有文件名臨時名稱,然後添加你喜歡的任何名稱

import glob,os 
images = glob.glob("*.tif") 
for i in range(len(images)): 
     os.rename(images[i], 'temp_'+str(i)+'.tif') 

tempImages = glob.glob("temp*.tif") 

for i in range(len(tempImages)): 
     os.rename(tempImages[i], 'area'+str(i+1)+'.tif') 
+0

如果我想在沒有臨時文件的情況下做什麼?它會以同樣的方式工作? – Link

+1

@Link如果您沒有臨時文件,則可能會發生文件名衝突。這就是文件刪除的原因,你提到「它刪除了一些文件(這很奇怪,我知道...)」。似乎它試圖重命名現有的文件。例如:如果在索引匹配時有22個文件,而其他文件上有22個文件。它將用該文件重命名area22文件。 – john

1

也發現了這個其他的解決辦法。但是這個有一個小小的區別,最後做一個更好的工作方式(至少對我來說):爲每個區域創建一個文件夾。這麼簡單,我以前沒有想到...

順便說一句,這裏是代碼,評論。我正在使用這個,只是因爲我達到了我想要的。感謝所有回答,讓我學習新事物。

path = (os.path.expanduser('~\\FOLDER\\AREA1\\')) #select folder 
files = os.listdir(path) 

i = 1 #counter 
name = 'area' #variable which the file will take as name 

for file in files: 
    if file.endswith('.tif'): #search only for .tif. Can change with any supported format 
     os.rename(os.path.join(path, file), os.path.join(path, name + str(i)+'.tif')) #name + str(i)+'.tif' will take the name and concatenate to first number in counter. #If you put as name "area1" the str(i) will add another number near the name so, here is the second digit. 
     i += 1 #do this for every .tif file in the folder 

這有點簡單,但因爲我把文件放在兩個單獨的文件夾中。如果將這些文件保存在同一個文件夾中,這將無法正常工作。

編輯:現在,我看到了,它與我上面的代碼一樣....