致所有人:
我有一个关于在python中从string转换为float的问题以及你可以提供的关于我的代码的任何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很新。有关此代码或其他方法的任何建议将不胜感激。
答案 0 :(得分:0)
您将遇到的最大问题是确保您可以区分状态。正如其他人所指出的那样,你怎么知道你没有时间和99个细胞或另外100个细胞从上一行继承?
我首先尝试找出有关数据的独特之处,以便能够区分它。是否有一系列值对每个细胞有意义?当然不是处理它的最安全的方法,但如果您已经显示了数据的全部内容,那么我不确定其他选项是什么。
就代码而言,我会根据空间分割线作为分隔符。如果你得到了结果字典的大小,你可以判断你是否有完整的记录,或者你是否达到了100列限制。 (不要忘记删除换行符的最后一个元素)你还需要一种方法来判断第一个元素是时间还是只是另一个单元格。
希望这至少能使你朝着正确的方向前进。
答案 1 :(得分:0)
正如评论所指出的那样,数据的规范是模糊的,并且可能导致错误解析的数据,即如果时序行恰好有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 = []
为了提高清晰度和效果,我将其定义为generator function。
将已解析的输出打印为新文件,作为制表符分隔的条目:
out = open("outfile.dat", "w")
for line in unwrap_data("input_file.dat"):
out.write("\t".join(line) + "\n")
请注意,该函数返回字符串值列表。要将值用作float,请使用map_func
参数。
在下一个示例中,我们传入float()
函数,以便将每个条目转换为float。然后我们打印出time
(第一列)和最小/最大单元格值(剩余列)。
for line in unwrap_data("input_file.dat"):
print line[0], min(line[1:]), max(line[1:])
我还参数化了包装长度,以便您可以通过在调用函数时包含wrap_len=<new_value>
参数来更改它。
希望得到这个帮助。