Python无法将字符串转换为浮点…操作文本文件

Python无法将字符串转换为浮点…操作文本文件,python,text,Python,Text,对所有人: 我有一个关于在python中从字符串转换为浮点的问题,以及关于我的代码的任何python建议 我认为向你展示我的问题的最好方式是解释我在做什么 我有一个由fortran程序生成的txt文件。此文本文件的格式为: 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

对所有人:

我有一个关于在python中从字符串转换为浮点的问题,以及关于我的代码的任何python建议

我认为向你展示我的问题的最好方式是解释我在做什么

我有一个由fortran程序生成的txt文件。此文本文件的格式为:

 0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000
 0.000
 0.500     0.156     0.154     0.152     0.151     0.148     0.144     0.141     0.138     0.135     0.132     0.130     0.127     0.124     0.121     0.118     0.115     0.112     0.110     0.107     0.104     0.102     0.100     0.097     0.093     0.089     0.087     0.084     0.082     0.079     0.076     0.074     0.072     0.069     0.067     0.064     0.063     0.060     0.058     0.056     0.054     0.052     0.051     0.049     0.044     0.041     0.038     0.036     0.034     0.031     0.029     0.027     0.026     0.024     0.022     0.020     0.018     0.016     0.015     0.013     0.012     0.010     0.009     0.007     0.006     0.004     0.003     0.002     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000     0.000
 0.000
第一个值0.0是一个时间,第二个值是cell1处的水高度,等等。它当前在处理过程中,在100次输入后创建一条换行,并在每个新时间创建一条换行。我希望能够编写python代码,使其看起来像:

time1     cell1     cell2     .....
time2     cell1     cell2     .....
需要记住的是,单元格的数量会有所不同,每100个单元格就会创建一条换行。(我上面的例子只给出了时间和100个单元格作为演示。)

到目前为止,我的代码如下

    from pylab import *
    from numpy import *
    import math

    ########################

    a=open('wh.txt','r')
    b=open('new.txt', 'w')

    for line in a:
      b.write(line.lstrip())

    c=open('new.txt','r')
    d=open('newer.txt','w')

    for line in c:
      d.write(line.replace('\n','     '))

    e=loadtxt('newer.txt')
    o=open('newest.txt','w')



    ### v = value to split, l = size of each chunk
    h = lambda v, l: [v[i*l:(i+1)*l] for i in range(int(math.ceil(len(v)/float(l))))]

    g=list(h(tuple(e),102))


    with open("newest.txt","w") as o:
        o.write('\n'.join(map(str,g)))
这将以元组的形式提供输出:

(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
(    0.5, 0.156, 0.154, 0.152, 0.151, 0.14799999999999999, 0.14399999999999999, 0.14099999999999999, 0.13800000000000001, 0.13500000000000001, 0.13200000000000001, 0.13, 0.127, 0.124, 0.121, 0.11799999999999999, 0.115, 0.112, 0.11, 0.107, 0.104, 0.10199999999999999, 0.10000000000000001, 0.097000000000000003, 0.092999999999999999, 0.088999999999999996, 0.086999999999999994, 0.084000000000000005, 0.082000000000000003, 0.079000000000000001, 0.075999999999999998, 0.073999999999999996, 0.071999999999999995, 0.069000000000000006, 0.067000000000000004, 0.064000000000000001, 0.063, 0.059999999999999998, 0.058000000000000003, 0.056000000000000001, 0.053999999999999999, 0.051999999999999998, 0.050999999999999997, 0.049000000000000002, 0.043999999999999997, 0.041000000000000002, 0.037999999999999999, 0.035999999999999997, 0.034000000000000002, 0.031, 0.029000000000000001, 0.027, 0.025999999999999999, 0.024, 0.021999999999999999, 0.02, 0.017999999999999999, 0.016, 0.014999999999999999, 0.012999999999999999, 0.012, 0.01, 0.0089999999999999993, 0.0070000000000000001, 0.0060000000000000001, 0.0040000000000000001, 0.0030000000000000001, 0.002, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

我不确定我做错了什么,因为我对python相当陌生。如果您对该代码或其他方法有任何建议,我们将不胜感激。

您将遇到的最大问题是确保您能够区分不同的状态。正如其他人所指出的,你怎么知道你没有时间和99个细胞,或者是前一行的额外100个细胞

我将首先尝试找出数据的独特之处,以便能够区分它。每个单元格是否有一系列有意义的值?当然不是最安全的处理方式,但如果你所展示的数据就是它的全部,我不确定还有什么其他选择

就代码而言,我会根据空间分割行作为delimeter。如果您得到了结果dict的大小,您可以判断您是否有完整的记录,或者是否达到了100列的限制。(别忘了去掉换行符的最后一个元素)您还需要一种方法来判断第一个元素是时间还是另一个单元格


希望这至少能将您推向正确的方向。

正如评论所指出的,您的数据规范不明确,可能会导致错误解析的数据,即,如果一个计时行正好有100个单元格,则下一个计时行可能会被误认为是当前行的一部分

尽管如此,我还是尝试了一个实现来帮助您上路。它的评论很通俗,有助于理解,但如果您需要澄清,请随时询问

def unwrap_data(filename, wrap_len=101, map_func=None):
    """
    Generator which reads a file and returns a list of float,
    one for each data row.

    Rows in the file are assumed to be wrapped after every 
    wrap_len columns, so we unwrap it before returning each
    data row.

    wrap_len defaults to 101 (1 time column + 100 cell values).

    Caveat: If a timing data has exactly 100 cell values (101 
    columns), the output of this function will be wrong unless
    an additional newline exists before the next timing row, e.g.

         time1      cell1_1    cell1_2  ... cell1_100
         cell1_101  cell1_102  ...
         time2      cell2_1    cell2_2  ... cell2_100

         time3      cell3_1    cell3_2  ...
    """
    next_data = []
    for line in open(filename, 'r'):  # for each line in file
        L = line.strip().split()
        if map_func:
            L = map(map_func, L)  # run map_func() on each list element
        next_data.extend(L)  # add to prev row
        if len(L) != wrap_len and next_data: 
            # the line was not wrapped, assume new timing data
            # "and next_data" will avoid returning empty lists for blank lines
            yield next_data
            next_data = []
我将其定义为一种提高清晰度和性能的方法

用法示例: 要将解析后的输出作为制表符分隔的条目打印到新文件中,请执行以下操作:

out = open("outfile.dat", "w")
for line in unwrap_data("input_file.dat"):
    out.write("\t".join(line) + "\n")
请注意,该函数返回字符串值列表。要将这些值用作浮点,请使用
map\u func
参数

在下一个示例中,我们传入
float()
函数,以便将每个条目转换为一个float。然后打印出
时间
(第一列)和最小/最大单元格值(剩余列)

我还对wrap长度进行了参数化,以便在调用函数时通过包含
wrap\u len=
参数来更改它


希望这对你有所帮助。

我不明白你想要实现什么。从您编写的内容来看,似乎您只是想从文件中删除换行符。@Cito我想创建一个值数组,其中时间在第一列,然后我的单元格值在它旁边的列中。问题是,如果我只删除换行符,我不知道如何返回并将换行符添加到我想要的位置。为什么不使用.split(),在空格处进行定界?@johnthexiii John,如果我只想在某些空格处进行定界,这行得通吗?你能给我举个例子说明怎么做吗?如果在某个时间有199个细胞呢?那会给你2整行,每行100个数字。。。你如何区分这段时间和两段时间,每段时间有99个细胞?非常感谢你的帮助……这比我想象的要多得多。也谢谢你愿意回答我的任何问题。如果我跟不上什么,我会告诉你的。我很难让地图功能在我的文本文件上工作,任何帮助都将不胜感激。
for line in unwrap_data("input_file.dat"):
    print line[0], min(line[1:]), max(line[1:])