【问题标题】:How to Run script for multiple text files with a common string?如何为具有公共字符串的多个文本文件运行脚本?
【发布时间】:2019-08-15 21:07:43
【问题描述】:

在我的研究工作中,我有多个文本文件有一个共同的字符串“Max”,而 Max 的不同值在 0.10 到 2.00 的范围内,步长为 0.10,如下所示:

 A_100Hz_Rate20Hz_5tot_0.10Max_1_ 
 A_100Hz_Rate20Hz_5tot_0.10Max_2_
 A_100Hz_Rate20Hz_5tot_0.10Max_3_
 .
 .
 .
 A_100Hz_Rate20Hz_5tot_2.00Max_1_ 
 A_100Hz_Rate20Hz_5tot_2.00Max_2_
 A_100Hz_Rate20Hz_5tot_2.00Max_3_

我需要根据 Max 的值(例如:0.10Max)导入所有文件,以分别获取具有相同 Max 值的文件的平均值以获取:

 Ave_A_100Hz_Rate20Hz_5tot_0.10Max_3_
 .
 .
 .
 Ave_A_100Hz_Rate20Hz_5tot_2.00Max_3_

我尝试了一个手动 glob 模块,它对“Max”的一个值运行良好,但在整个范围内它不起作用。这是我的代码:

import numpy as np
import glob
import pandas as pd

h = np.linspace(0.10,2.00,20)  
for x in h: 
     x1 = ("%.2f" % x)
     glob_path = 'input/*_{}Vbr_*.txt'.format(x1)
     import_files = glob.glob(glob_path)
     print(x,import_files )
     for index, file_name in enumerate(import_files ):
          merged_data = pd.read_csv(file_name, header=None, delimiter="\t").values
          if index==0:    
               summation = merged_data
          else:
               summation = summation + merged_data
          averaging = summation/len(import_files)         
          np.savetxt('output/Ave_'+file_name[10:], averaging, delimiter="\t" )

我需要编写一个通用脚本。但是,在我的情况下,现在我使用只有两个值 x = 1.50 和 x = 2.0 的脚本来简化操作。我尝试了 print(import_files) 并期望输出为:

['input\\A_100Hz_Rate20Hz_5tot_1.50Max_1_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_1.50Max_2_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_1.50Max_3_.txt']


['input\\A_100Hz_Rate20Hz_5tot_2.00Max_1_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_2.00Max_2_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_2.00Max_3_.txt']

但实际输出是(简而言之):

0.1 []
0.2 []
1.5 ['input\\A_100Hz_Rate20Hz_5tot_1.50Max_1_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_1.50Max_2_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_1.50Max_3_.txt']
1.6 []
1.7 []
2.0['input\\A_100Hz_Rate20Hz_5tot_2.00Max_1_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_2.00Max_2_.txt', 
'input\\A_100Hz_Rate20Hz_5tot_2.00Max_3_.txt']

导致内核出错

      np.savetxt('output/Ave_'+file_name[10:], averaging, delimiter="\t" )

 NameError: name 'file_name' is not defined

请问有什么建议吗?

【问题讨论】:

  • 就实际输出而言,如果与 glob 模式不匹配,您将获得空列表 ([ ])。对于 NameError: name 'file_name' is not defined,我猜这是关于内部 for 循环的一些缩进问题。代码是如何通过“pd.read_csv(file_name...”) 行的,该行也使用相同的变量 (file_name)
  • 只是为了详细说明ranjith 的评论,您应该将print(import_files ) 替换为print(x, import_files),以便更清楚地了解您获得空列表的x 值。
  • @ranjith 如果没有我的手动 glob,代码运行良好,h = np.linspace(0.10,2.00,20) for x in h: x1 = ("%.2f" % x ) glob_path = 'input/*{}Vbr*.txt'.format(x1)
  • @SergeBallesta - print(x, import_files) 给我:0.1 [ ] , 0.2 [ ] 等等...
  • @SergeBallesta - 我编辑了我的问题,请看一下!

标签: python python-3.x for-loop file-io glob


【解决方案1】:

我认为你只需测试import_file是否为空:

for x in h: 
     x1 = ("%.2f" % x)
     glob_path = 'input/*_{}Vbr_*.txt'.format(x1)
     import_files = glob.glob(glob_path)
     print(x,import_files )
     if len(import_files) != 0:
         for index, file_name in enumerate(import_files ):
              merged_data = pd.read_csv(file_name, header=None, delimiter="\t").values
              if index==0:    
                   summation = merged_data
              else:
                   summation = summation + merged_data
          averaging = summation/len(import_files)         
          np.savetxt('output/Ave_'+file_name[10:], averaging, delimiter="\t" )

【讨论】:

  • 它给了我错误 if (len(import_files != 0): ^ SyntaxError: invalid syntax
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多