根据计算自动选择文件名,然后将它们导入到python [英] Choose File names automatically based on a calculation and then import them to python

查看:305
本文介绍了根据计算自动选择文件名,然后将它们导入到python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have run into a wall where I don't know how to proceed further. I generate a lot of Raw Data from my CFD simulations. All the raw data will be in text format. The format of the text file will be "hA-'timestep'.txt" where A equals 0,1,2,3,4,5,6,7,8,9. For Eg h1-0500.txt will refer to data obtained along h1 at 500th time step.All the files of hA will be saved in a single folder. In my post processing, I want to import files at different flow times and do some analysis. I have written a code where it will calculate the timestep based on some equation which needs the flow time as user input.

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

What I would like to do is import all those files which correspond to the a particular timestep calculated through an equation.For Example, if I give an input of 2400 for the flow time, then the equation will give me time step as 16144. I want those file names which correspond to this time step to be automatically imported.Please see the below code.

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

I have uploaded the files corresponding to 16144. How do I choose the file name automatically based on the time step that is calculated. Currently after getting the time step from equation, I have to manually change the file name. I would really appreciate if some one could guide me on this. Samplefiles

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

错误消息:

Enter the flow time required: 1250
8477
timestep: 8477

file(s) found:  ['E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h0-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h1-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h2-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h3-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h4-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h5-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h6-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h7-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h8-8477.txt', 'E:/Fall2015/Research/CFD/ddn110B/Transfer/xline\\h9-8477.txt']
working in: E:/Fall2015/Research/CFD/ddn110B/Transfer/xline on: h0-8477
Traceback (most recent call last):

  File "<ipython-input-52-0503f720722f>", line 54, in <module>
    data2 = np.loadtxt(filename, skiprows=1)

  File "E:\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\site-packages\numpy\lib\npyio.py", line 691, in loadtxt
    fh = iter(open(fname, 'U'))

IOError: [Errno 2] No such file or directory: 'h9-8477.txt'


推荐答案

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

I hope I got what you meant but it wasn't that clear. When the user inputs the timestep, then only the files corresponding to that timestep are loaded and used further with your plotting function:

我考虑了以下结构:

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)

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

UPDATE: made some edits (comments)

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

UPDATE2: using regular expressions on file search, the filter is '^.*-({: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

这篇关于根据计算自动选择文件名,然后将它们导入到python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆