如何在同一行上返回类似的文件名

问题描述:

我在这里有点新手,所以请裸机...我为我的工作编写了一个程序来返回文件名和持续时间,所以我可以轻松地将它们添加到电子表格。我想要在同一行上返回类似的文件名,以便我可以一次复制整行相同的文件。如何在同一行上返回类似的文件名

这是到目前为止我的代码:

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'文件和持续时间等。

为了回答你的问题,我创建了一个字典(包含文件名及其相应的持续时间)和一个列表(包含文件名):它们都由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

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() 

它未经测试,但它应该工作。

请记住,该脚本只适用于包含用破折号分隔的值的文件名。

,而不是打印您需要在主函数结束的信息,简单地把这个结果在一个字符串变量:

results= '' 

取而代之的是打印的:

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

\n是为回报。

+0

您应该使用的代码块表示代码,而不是块报价... – Cosinux

+1

@Cosinux好,我打算做到这一点,但对于堆栈交易所Android应用程序是为凌乱的代码缩进。 ..但我同意你的评论,理解 – Xander