【问题标题】:Creating a python dictionary in python from tab delimited text file with headers as keywords从以标题为关键字的制表符分隔的文本文件在python中创建python字典
【发布时间】:2016-10-10 12:28:03
【问题描述】:

我对 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 通常会返回:

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

因此,如果我想同时读取字符串数据和数值,我认为我需要使用另一个模块。如果有人对我如何做这件事有任何建议,或者知道一个更好的模块来做这件事,我将不胜感激。

基思

【问题讨论】:

  • 看熊猫模块

标签: python arrays numpy dictionary text


【解决方案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

【讨论】:

  • 谢谢劳伦斯。我会调查的。
【解决方案2】:

另一种方法可能是为 Python 本身使用 csv 模块。

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

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

【讨论】:

  • 按照 Laurens 的建议,我设法使用 pandas 很好地工作,但使用 delimiter='\s+'。我相信 s+ 表示一个或多个空格作为分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多