【问题标题】:Comparing two lists of filenames that are not identical比较两个不相同的文件名列表
【发布时间】:2016-03-10 00:34:19
【问题描述】:

我有一个文件夹,其中包含 csv 和 txt 文件中的数据集(一个 csv 和一个 txt 文件用于一项实验)。只有当我可以找到 csv 和 txt 文件,形成“对”(并非总是如此)时,我才想分析它们。

我在文件夹中创建了两个文件列表:

list_signal =  glob.glob(filepath + '/*.txt')
list_zvec = glob.glob(filepath + '/*.csv')

我的想法是比较这两个列表并仅使用匹配的名称创建新列表。问题是文件名不相同。这些对看起来像这样:

2013_09_12__14_12_06h_zvec.csv

2013_09_12__14_12_06h_signal.txt

2013_09_12__14_12_45h_zvec.csv

2013_09_12__14_12_45h_signal.txt

我在想这些方面的东西,但 Python 不喜欢它(返回一个空列表,可能将一个列表中文件名中的前 21 个字符与另一个列表中的全长文件名进行比较):

for filename in list_signal:
    if filename[0:21] in file_list_zvec:
        list_zvec2.append(filename)

列表中文件名的顺序在以后很重要。

这里的新手,温柔点:)。

【问题讨论】:

  • “Python 不理解它”:这到底是什么意思?
  • 它返回了一个空列表。我的猜测是将 list_signal 中文件名的前 21 个字符与第二个列表中的全长文件名进行比较。

标签: python list


【解决方案1】:

听起来您需要来自file_list_zvec 的缩短文件名列表:

[f[0:21] for f in file_list_zvec]

【讨论】:

    【解决方案2】:

    您需要将您的缩写名称 signal[:21] 与其他 file_list_zvec 列表中的每个项目匹配

    for signal in list_signal:
        for zvec in file_list_zvec:
            if signal[:21] in zvec:
                list_zvec2.append(signal)
                break
    

    【讨论】:

      【解决方案3】:

      这应该会找到目录中多次出现的所有文件名(具有不同的扩展名):

      import os
      
      filelist=os.listdir(os.getcwd())
      filenames=[]
      for thisfile in filelist:
          filename=thisfile[0:22]
          filenames.append(filename)
      files=set()
      doubles=set( x for x in filenames if x in files or files.add(x) )
      

      您不能通过以下方式遍历至少出现一次的所有文件名:

      for filename in doubles:
        # whatever you want to do with the filename
      

      【讨论】:

        【解决方案4】:

        您真的需要两个列表吗?只需存储所有必需文件都存在的前缀列表,然后处理该列表。另请注意,glob 返回完整路径而不仅仅是文件名,因此 [0:21] 可能不起作用。

        ## to initialize
        prefixes = []
        
        for file in glob.glob(filepath + '/*.txt'):
            prefix = os.path.basename(file)[:21]
        
            if os.path.exists(filepath + '/' prefix + '_zvec.csv'):
                prefixes.append(prefix)
        
        ## ...      
        ## then later on, when processing
        for prefix in prefixes:
            processTxt(filepath + '/' prefix + '_signal.txt')
            processCsv(filepath + '/' prefix + '_zvec.csv')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多