2016-10-10 54 views
0

我是相当新的Python和时遇到了麻烦试图创建一个函数,它读取标签deliminated文本文件和外币从数据字典。我主要是处理下列格式的文本文件具有多个选项卡的deliminated数值数据列有用于每列对应的标头:Python中的制表符分隔文本文件,头一个Python字典作为关键字

Time_(s) Mass_Flow_(kg/s) T_in_pipe(C) T_in_water(C) T_out_pipe(C) T_out_water(C) 

0 1.2450 16.9029 16.8256 16.6234 16.6204 
    2.8700 1.2450 16.8873 16.8094 16.6237 19.6507 
    5.6600 1.2450 16.8889 16.8229 19.1406 29.1320 
    8.7800 1.2450 16.8875 16.8236 24.1325 34.9077 
    11.6200 1.2450 16.8794 16.8040 28.3927 38.5443 
    16.0600 1.2450 16.8615 16.7942 33.7205 42.4149 
    18.8900 1.2450 16.8512 16.7938 36.2797 44.1221 
    23.0200 1.2450 16.8319 16.7903 39.2102 46.1857 
    25.7600 1.2450 16.8380 16.7952 40.7243 47.2657 

优选地,我想要写存储数据的每列作为一个代码数组,还可以将每列的标题存储到单独的数组中,以便我可以将它们用作字典中的关键字。例如,如果我查找字典键“Mass_Flow_(公斤/秒)”,阵列将返回所有在质量流速柱(不包括报头)中的值的。

到目前为止,我已经采用numpy.loadtxt创建从柱这样的数字阵列尝试,但我还没有成功地抽取标题数据,从而不得不跳过此线。下面的代码会生成我想要的字典,但我宁愿有一个更灵活的代码,即使名称已经包含在.txt文件中,也不需要我手动命名每个列。

import numpy as np 


time, m_flow, Tin_pipe, Tin_water, Tout_pipe, Tout_water = np.loadtxt("pipeData.txt",skiprows=1,unpack=True) 

#Assign each column in file to respective arrays 

my_dict = {"Time":time, "Mass flow rate":m_flow, "Tin_pipe":Tin_pipe, "Tin_water":Tin_water, "Tout_pipe":Tout_pipe, "Tout_water":Tout_water} 
#Line arrays to keywords and merge into a dictionary 

我已经试过没有跳过第一行,但loadtxt通常返回王氏:

ValueError: could not convert string to float: Time_(s) 

所以我想我需要使用另一个模块,如果我想读这两个字符串数据和数值。如果任何人有任何关于如何去做这件事的建议或知道更好的模块来做到这一点,将不胜感激。

基思

+1

看看大熊猫模块 –

回答

1

看看在Pandas module

# This module kicks ass 
import pandas as pd 

pipe_data = pd.read_csv('pipeData.txt', sep='\t') 

print pipe_data.columns # prints Time_(s), Mass_Flow_(kg/s), ... 

print pipe_data['Time_(s)'] # print the Time_(s) column 
+0

谢谢劳伦斯。我会研究这一点。 –

0

另一种可能是使用的CSV模块Python本身。

import csv 

with open('temp.txt') as csvfile: 
    csvrows = csv.reader(csvfile, delimiter='\t') 
    fieldnames=next(csvrows) 
    print (fieldnames) 
    for row in csvrows: 
     print (row) 

当我拿起您提供的数据并用单个选项卡替换列之间的多个空格时,这些就是结果。

['Time_(s)', 'Mass_Flow_(kg/s)', 'T_in_pipe(C)', 'T_in_water(C)', 'T_out_pipe(C)', 'T_out_water(C)'] 
['0', '1.2450', '16.9029', '16.8256', '16.6234', '16.6204'] 
[' 2.8700', '1.2450', '16.8873', '16.8094', '16.6237', '19.6507'] 
[' 5.6600', '1.2450', '16.8889', '16.8229', '19.1406', '29.1320'] 
[' 8.7800', '1.2450', '16.8875', '16.8236', '24.1325', '34.9077'] 
[' 11.6200', '1.2450', '16.8794', '16.8040', '28.3927', '38.5443'] 
[' 16.0600', '1.2450', '16.8615', '16.7942', '33.7205', '42.4149'] 
[' 18.8900', '1.2450', '16.8512', '16.7938', '36.2797', '44.1221'] 
[' 23.0200', '1.2450', '16.8319', '16.7903', '39.2102', '46.1857'] 
[' 25.7600', '1.2450', '16.8380', '16.7952', '40.7243', '47.2657'] 

主要问题可能是前导空白留在第一列。

+1

我设法得到由劳伦斯但分隔符=“\ S +”为表明,它很好地工作使用的大熊猫。 s +表示一个或多个空格作为分隔符,我相信。 –

相关问题