2016-07-04 18 views
-1

我在這裏有點新手,所以請裸機...我爲我的工作編寫了一個程序來返回文件名和持續時間,所以我可以輕鬆地將它們添加到電子表格。我想要在同一行上返回類似的文件名,以便我可以一次複製整行相同的文件。如何在同一行上返回類似的文件名

這是到目前爲止我的代碼:

import os, wave 

def main(): 

    directory = input("What is the directory? ") 
    for file in sorted(os.listdir(directory)): 
     if file.endswith(".wav"): 
      with wave.open(file, 'rb') as f: 
       frames = f.getnframes() 
       rate = f.getframerate() 
       total_seconds = frames/float(rate) 
       minutes = total_seconds/60 
       seconds = total_seconds % 60 
       hours = minutes/60 
       minutes = minutes % 60 
       duration = '%.2d:%.2d:%.2d' % (hours, minutes, seconds) 
       print(file[:-4], duration) 

main() 

它返回:

sa-01003-32-su01-pm 00:04:41 
sa-01003-32-su02-pm 00:02:20 
sa-01003-32-su03-pm 00:09:50 
sa-01003-32-su05-pm 00:09:41 
sa-01003-32-su06-pm 00:10:15 
sa-01003-32-su07-pm 00:09:49 
sa-01003-32-su08-pm 00:01:05 
sa-01003-33-su01-pm 00:04:04 
sa-01003-33-su03-pm 00:02:09 
sa-01003-33-su04-pm 00:09:45 
sa-01003-33-su05-pm 00:09:39 
sa-01003-33-su06-pm 00:10:30 
sa-01003-33-su07-pm 00:09:56 
sa-01003-33-su08-pm 00:01:05 

所以我想對所有的「32」文件和持續時間是在一條線,分離只有空格以及下一行的'33'文件和持續時間等。

回答

0

爲了回答你的問題,我創建了一個字典(包含文件名及其相應的持續時間)和一個列表(包含文件名):它們都由main()函數返回。接下來,我創建了一個函數,根據您的需要打印值。簡而言之,函數檢查列表中的名稱是否具有相同的前綴(例如,'sa-01003-32-):如果是,則名稱及其相應的持續時間(來自字典)將打印在由a空間。如果沒有,則打印新的一行。下面是代碼:

def main(): 
    directory = input("What is the directory? ") 
    dic_file={} # A dictionary that will store the file names and their duration 
    list_file=[] # A list of the file names (needs to contain the same names that are present in the dictionary) 
    for file in sorted(os.listdir(directory)): 
     if file.endswith(".wav"): 
      with wave.open(file, 'rb') as f: 
       frames = f.getnframes() 
       rate = f.getframerate() 
       total_seconds = frames/float(rate) 
       minutes = total_seconds/60 
       seconds = total_seconds % 60 
       hours = minutes/60 
       minutes = minutes % 60 
       duration = '%.2d:%.2d:%.2d' % (hours, minutes, seconds) 
       list_file.append(file) 
       dic_file.setdefault(file,duration) 
    return dic_file,list_file #return the dictionary and the list 

def print_value(dic_file,list_file): 
    list_file.sort() 
    for n,item in enumerate(list_file): 
     while True: 
      if n<len(list_file)-1: 
       if list_file[n+1][:-11]==item[:-11]: 
        print(item,dic_file[item],end=' ') 
       else: 
        print(item,dic_file[item]+'\n') 
      break 
    print(list_file[len(list_file)-1],dic_file[list_file[len(list_file)-1]]) 

dic_file,list_file=main() 
print_value(dic_file,list_file) 
+0

更好,我發現這對我來說最合適。非常感謝你的幫助,你不知道你救了我的麻煩! – SandyBeach

1
import os, wave 

def main(): 
    directory = input("What is the directory? ") 

    current = None 
    similar = [] 

    for file in sorted(os.listdir(directory)): 
     if file.endswith(".wav"): 
      with wave.open(file, 'rb') as f: 
       frames = f.getnframes() 
       rate = f.getframerate() 
      total_seconds = frames/float(rate) 
      minutes = total_seconds/60 
      seconds = total_seconds % 60 
      hours = minutes/60 
      minutes = minutes % 60 
      duration = '%.2d:%.2d:%.2d' % (hours, minutes, seconds) 

      txt = file[:-4] + " " + duration 
      value = file.split("-")[3] 
      if not current == None: 
       if value == current: 
        similar.append(txt) 
       else: 
        print(" ".join(similar)) 
        similar = [] 
      else: 
       current = value 
       similar.append(txt) 

main() 

它未經測試,但它應該工作。

請記住,該腳本只適用於包含用破折號分隔的值的文件名。

1

,而不是打印您需要在主函數結束的信息,簡單地把這個結果在一個字符串變量:

results= '' 

取而代之的是打印的:

results += file[:-4] + ' ' + duration + '\n' 

\n是爲回報。

+0

您應該使用的代碼塊表示代碼,而不是塊報價... – Cosinux

+1

@Cosinux好,我打算做到這一點,但對於堆棧交易所Android應用程序是爲凌亂的代碼縮進。 ..但我同意你的評論,理解 – Xander

相關問題