根据计算自动选择文件名,然后将它们导入到python

时间:2015-11-22 22:34:17

标签: python numpy matplotlib import filenames

我遇到了一堵墙,我不知道如何继续前进。我从CFD模拟中生成了大量原始数据。所有原始数据都将采用文本格式。文本文件的格式为“hA-'timestep'.txt”,其中A等于0,1,2,3,4,5,6,7,8,9。例如,h1-0500.txt将引用在第500个时间步沿h1获得的数据。所有hA文件将保存在一个文件夹中。在我的后期处理中,我想导入不同流时间的文件并进行一些分析。我编写了一个代码,它将根据需要流动时间作为用户输入的某个等式计算时间步长。

我想要做的是导入所有那些与通过等式计算的特定时间步长相对应的文件。例如,如果我为流量时间输入2400,那么方程式将给我时间步长为16144.我希望自动导入与此时间步长相对应的文件名。请参阅下面的代码。

我上传了与16144对应的文件。如何根据计算的时间步长自动选择文件名。目前,从等式中获取时间步长后,我必须手动更改文件名。如果有人可以指导我,我真的很感激。 Samplefiles

context.done()

错误讯息:

 # Notes about the Simulation#
 # Total No. of Time Steps completed = 16152
 # No. of Time Steps completed in HPC = 165
 # Flow Time before HPC = 3.1212s
 # Total Flow time of Fill Cycle = 2401.2s

import numpy as np
from matplotlib import pyplot as plt
import os

FT_init = 3.1212
delt = 0.15 # Timestep size
TS_init = 165 
flowtime = input("Enter the flow time required: ") # This is user input. Timestep will be calculated based on the flow time entered.
timestep = (flowtime-FT_init)/delt
timestep = round(timestep + TS_init)
print timestep 

def xlineplots(X1,Y1,V1,Tr1):
  plt.figure(1)
  plt.plot(X1,Tr1)
  plt.legend(['h0','h3','h5','h7','h9'],loc=0)
  plt.ylabel('Tracer Concentration')
  plt.xlabel('X (m)')
  plt.title('Tracer Concentration Variation along the Tank width')
  plt.figtext(0.6,0.6,"Flow Time = 2400s",style= 'normal',alpha = 0.5)
  plt.figtext(0.6,0.55,"Case: ddn110B",style= 'normal')
  plt.savefig('hp1.png', format='png', dpi=600) 

  plt.figure(2)
  plt.plot(X1,V1)
  plt.legend(['h0','h3','h5','h7','h9'],loc=0)
  plt.ylabel('V (m/s)')
  plt.xlabel('X (m)')
  plt.title('Vertical Velocity Variation along the Tank width')
  plt.figtext(0.6,0.6,"Flow Time = 2400s",style= 'normal',alpha = 0.5)
  plt.figtext(0.6,0.55,"Case: ddn110B",style= 'normal',alpha = 0.5)
  plt.savefig('hv1.png', format='png', dpi=600) 

 path1='Location of the Directory' # Location where the files are located 

 filename1=np.array(['h0-16144.txt','h3-16144.txt','h5-16144.txt','h7-16144.txt','h9-16144.txt'])

for i in filename1:
  format_name= i
  data1  = os.path.join(path1,format_name)
  data2 = np.loadtxt(data1,skiprows=1)
  data2 = data2[data2[:,1].argsort()]    
  X1 = data2[:,1]  # Assign x-coordinate from the imported text file
  Y1 = data2[:,2]  # Assign y-coordinate from the imported text file
  V1 = data2[:,4]  # Assign y-velocity from the imported text file
  Tr1 = data2[:,5] # Assign Tracer Concentration from the imported text file
  xlineplots(X1,Y1,V1,Tr1)

2 个答案:

答案 0 :(得分:2)

生成文件名或查找与某种模式匹配的文件名是一个问题吗?

我可以使用以下方式重新编写代码:

hs = [0,3,5,7,9]
timestep = 16144
filenames = ['h%s-%s'%(h, timestep) for h in hs]

for name in filenames:
    fname = op.path.join(path1, name)
    try:
        data = np.loadtxt(fname, skiprows=1)
    except IOError:
        # cannot open this file, most likely because it does not exist
        # continue with the next
        continue  
    ...

这里我正在生成具有所需格式的文件名,并在可能的情况下加载和使用每个文件名。

我可以将globre应用于目录列表进行搜索,但我的try-except方法没有任何问题。这是很好的Python风格。

========================

以下是使用glob(在Ipython会话中)的示例:

首先是带有一堆文件的testdir(用`touch创建):

In [9]: ls testdir
h1-123.txt  h12-1234.txt  h2-123.txt  h2-124.txt  h3-124.txt  h343.txt

In [10]: import glob

一般搜索以h开头的文件,以.txt结尾:

In [11]: glob.glob('testdir/h*.txt')
Out[11]: 
['testdir/h2-124.txt',
 'testdir/h3-124.txt',
 'testdir/h12-1234.txt',
 'testdir/h343.txt',
 'testdir/h1-123.txt',
 'testdir/h2-123.txt']

将其缩小为2个用短划线分隔的字段

In [12]: glob.glob('testdir/h*-*.txt')
Out[12]: 
['testdir/h2-124.txt',
 'testdir/h3-124.txt',
 'testdir/h12-1234.txt',
 'testdir/h1-123.txt',
 'testdir/h2-123.txt']

将第一个字段限制为单个字符

In [13]: glob.glob('testdir/h?-*.txt')
Out[13]: 
['testdir/h2-124.txt',
 'testdir/h3-124.txt',
 'testdir/h1-123.txt',
 'testdir/h2-123.txt']

表示特定的'时间'字符串:

In [14]: glob.glob('testdir/h?-123.txt')
Out[14]: ['testdir/h1-123.txt', 'testdir/h2-123.txt']

可以使用字符串格式

创建搜索字符串
In [15]: times=123
In [16]: glob.glob('testdir/h?-%s.txt'%times)

========================

使用osre我可以搜索:

In [28]: import os
In [29]: import re
In [30]: filelist=os.listdir('./testdir')
In [31]: [n for n in filelist if re.match('h[1-9]-123',n) is not None]
Out[31]: ['h1-123.txt', 'h2-123.txt']

======================

如果文件名必须包含4位数字(或其他),请使用以下内容:

'h%d-%04d'%(3,123)   # 'h3-0123'
'testdir/h?-%04d.txt'%times

无论您使用的是tryglob还是re,都需要这种填充。

Add zeros as prefix to a calculated value based on the number of digits

答案 1 :(得分:1)

我希望我得到你的意思,但不是那么清楚。当用户输入时间步长时,只加载与该时间步长相对应的文件,并进一步使用您的绘图功能:

我考虑了以下结构:

project/
| cfd_plot.py
+ sample/
| | h0-16144.txt
| | h1-16144.txt
| | h3-16144.txt
| | h0-25611.txt
| | h1-25611.txt
| | <...>

这里是cfd_plot.py

from __future__ import print_function
import numpy as np
from matplotlib import pyplot as plt
import os
import re

# pth is a path for plt to save the image
def xlineplots(X1, Y1, V1, Tr1n, pth):
    _, ax = plt.subplots()
    ax.plot(X1, Tr1)
    ax.legend(['h0', 'h3', 'h5', 'h7', 'h9'], loc=0)
    ax.set_ylabel('Tracer Concentration')
    ax.set_xlabel('X (m)')
    ax.set_title('Tracer Concentration Variation along the Tank width')
    plt.figtext(.6, .6, "Flow Time = 2400s", style='normal', alpha=.5)
    plt.figtext(.6, .55, "Case: ddn110B", style='normal')
    plt.savefig(pth + '-hp1.png', format='png', dpi=600)

    _, ax = plt.subplots()
    ax.plot(X1, V1)
    ax.legend(['h0', 'h3', 'h5', 'h7', 'h9'], loc=0)
    ax.set_ylabel('V (m/s)')
    ax.set_xlabel('X (m)')
    ax.set_title('Vertical Velocity Variation along the Tank width')
    plt.figtext(.6, .6, "Flow Time = 2400s", style='normal', alpha=.5)
    plt.figtext(.6, .55, "Case: ddn110B", style='normal', alpha=.5)
    plt.savefig(pth + '-hv1.png', format='png', dpi=600)


FT_init = 3.1212
delt = .15  # Timestep size
TS_init = 165
flowtime = input("Enter the flow time required: ")

timestep = (int(flowtime) - FT_init) / delt
timestep = round(timestep + TS_init)

reps = ['sample']  # location where the files are located

# first simple version
# files = []
# for rep in reps:  # recursive search for the files that match the timestep
#     for dirpath, dirnames, filenames in os.walk(rep):
#         for filename in [f for f in filenames if str(timestep) in f and f.endswith('.txt')]:
#             files.append(os.path.join(dirpath, filename))

# second version, using regular expressions
reg_exp = '^.*-({:d})\.txt'.format(timestep)

files = []
for rep in reps:  # recursive search for the files that match the timestep
    for dirpath, dirnames, filenames in os.walk(rep):
        for filename in [f for f in filenames if re.search(reg_exp, f)]:
            files.append(os.path.join(dirpath, filename))

print('timestep:', timestep)
print('file(s) found: ', files)

for file in files:
    directory = os.path.dirname(file)  # directory of the .txt file
    name = os.path.splitext(os.path.basename(file))[0]  # basename of the .txt file
    print('working in:', directory, 'on:', name)

    data2 = np.loadtxt(file, skiprows=1)
    data2 = data2[data2[:, 1].argsort()]
    X1 = data2[:, 1]  # Assign x-coordinate from the imported text file
    Y1 = data2[:, 2]  # Assign y-coordinate from the imported text file
    V1 = data2[:, 4]  # Assign y-velocity from the imported text file
    Tr1 = data2[:, 5]  # Assign Tracer Concentration from the imported text file

    # here you can give directory + name or just name to xlineplots
    xlineplots(X1, Y1, V1, Tr1, os.path.join(directory, name))
    # xlineplots(X1, Y1, V1, Tr1, name)

更新:进行了一些修改(评论)

UPDATE2 :在文件搜索中使用正则表达式,过滤器为'^.*-({:d})\.txt'.format(timestep)

^      match beginning of the line
.*     match any character (except newline), zero or multiple times
-      match the character -
({:d}) match the timestep, formatted as an integer
\.     match the character .
txt    match characters txt