使用python导入单列文本文件

时间:2014-07-08 17:57:41

标签: python parsing

我有一个文本文件,由组成单个列的数字组成,如下所示:

0
0
23
23
52433
0

我正在尝试将数据读入数组,然后对其进行绘图,我有以下脚本:

with open('r12c_24hr cement 1-11.TKA') as f:
    import numpy as np
    import matplotlib.pyplot as plt

    e = zip(*(map(float, line.split()) for line in f))
    count = 0
    bins = []
    while count < 8192:
        bins.append(count)
        count += 1

    print len(bins)
    print len(e)

当我尝试绘制e vs bin时,我得到的错误是它们的长度不同。当我打印长度时,bin为8192(正确长度),e为长度1.当我打印e和bin时,它们具有所有值。垃圾箱格式化

[0,1,2] 

但是e格式化了

[(0,1,2)]

我怀疑这是错误所在,但无法弄清楚如何正确导入文本文件中的值。

2 个答案:

答案 0 :(得分:3)

设置e的问题在于,首先创建一个浮点数列表*(map(float, line.split()) for line in f),其值作为位置参数传递给zip。将iterables作为位置参数,zip在调用(iter1[0], iter2[0], ..., iterN[0]), (iter1[1], iter2[1], ..., iterN[1]), ...时创建zip(iter1, iter2, ..., iterN)的可迭代。因此,在您的情况下,您正在创建一个列表,其唯一的元素是数字列表 - 双嵌套。

简单e = map(float, f)就足够了。 map接受一个函数,一个iterable来接受函数。由于文件f是一个可迭代的,在迭代时产生线并且你的线由一个数字组成,你可以直接传递它。

答案 1 :(得分:1)

每一行都将作为一个字符串读入,最后一行换行(除了可能是最后一行)。 float()函数(实际上是一个类型)忽略了无关的空格,所以你可以尝试像

这样的东西
e = [float(s) for s in f.readlines()]
你的循环中的

。但是,您的代码似乎确实假设文件中有8,192个数据值。您可能希望改为使用

bins = list(range(len(e))

总是会给你相同数量的箱子和e值。