2016-10-10 6 views
0

私はPythonには新しく、タブ区切りテキストファイルを読み込んでデータから辞書を作成する機能を作成しようとしています。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_(kg/s)"を検索すると、質量流量列(ヘッダを除く)のすべての値の配列が返されます。

これまで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は通常のwihを返します。

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

そこで私は、文字列データと数値の両方を読みたい場合は、別のモジュールを使用する必要があると思います。もし誰かがこれをやっていく方法や、これを行うためのより良いモジュールを知っているとの提案があれば、大いに感謝します。キース

+1

パンダのモジュールを見てください –

答えて

1

は、Python自身のためにCSVモジュールを使用するかもしれません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

ありがとうございますLaurens。私はこれを調べます。 –

0

代替を見てみましょう。

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) 

入力したデータを取り上げ、複数の空白を1つのタブで置き換えたときに、結果が表示されました。

['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

私は、Laurensが示唆しているようにパンダを使ってうまく動作するようになりましたが、区切り文字は '\ s +'となりました。 s +は、私が信じるデリミタとしての1つ以上の空白を示します。 –

関連する問題