Python 读取完整的数据文件,将数字四舍五入到小数点后2位,并以相同格式保存

Python 读取完整的数据文件,将数字四舍五入到小数点后2位,并以相同格式保存,python,statistics,string-formatting,type-conversion,Python,Statistics,String Formatting,Type Conversion,我正在尝试学习python,我打算将一个非常大的数据文件缩小,然后用R进行一些统计分析。我需要阅读数据文件(见下文): 并找到数字,在小数点后四舍五入两位,svae为最大数字,名称在TS前面。最后以相同格式保存数据文件,如下所示: SCALAR ND 3 ST 0 TS 10.00 0.00 0.00 0.00 SCALAR ND 3 ST 0 TS 3600.47 255.17 255.02 255.27 SCALAR ND 3 ST 0 TS*

我正在尝试学习python,我打算将一个非常大的数据文件缩小,然后用R进行一些统计分析。我需要阅读数据文件(见下文):

并找到数字,在小数点后四舍五入两位,svae为最大数字,名称在TS前面。最后以相同格式保存数据文件,如下所示:

SCALAR
ND    3
ST  0
TS        10.00
0.00
0.00
0.00
SCALAR
ND    3
ST  0
TS      3600.47
255.17
255.02
255.27
SCALAR
ND    3
ST  0
TS**MAX**      7200.42
255.60
255.49
255.70
我编写了如下代码:

import numpy as np
import matplotlib.pyplot as plt
import pickle

# Open file
f = open('data.txt', 'r')
thefile = open('output.txt', 'wb')
# Read and ignore header lines
header1 = f.readline()
header2 = f.readline()
header3 = f.readline()
header4 = f.readline()
data = []
for line in f:
    line = line.strip()
    columns = line.split()
    source = {}
    source['WSP'] = columns[0]
    #source['timestep'] = float(columns[1])
    source['timestep'] = columns[1]
    data.append(source)

f.close()
但是TS前面的数字无法读取。我想对数字进行四舍五入,但我使用的浮点数不起作用。在那之后,我想把它放在一个循环中。如果有任何建议,我的代码写得好吗?我将非常感谢您的帮助。

请尝试将%.2f”%float(列[1])四舍五入到小数点后两位。请注意,它提供的是字符串,而不是浮点。我不明白你问的其他问题

>>“%.2f”%255.5984

'255.60'
尝试将%.2f%浮点(列[1])四舍五入到小数点后两位。请注意,它提供的是字符串,而不是浮点。我不明白你问的其他问题

>>“%.2f”%255.5984


'255.60'

代码执行不正确(选择最大数值或保存到输出或…), 请把固定的放进去,
但是,如果只有浮点函数有问题,您可以选择%.2f或舍入(num,2)

代码执行不正确(选择最大num或保存到输出或…), 请把固定的放进去,
但是,如果您只在浮点函数中遇到问题,您可以选择%.2f或round(num,2)

以下是如何使用
格式
语法(新的python2/3格式语法)将某些浮点转换为带2位小数的字符串:

关于剩下的问题:您的代码似乎没有正确处理文本文件的格式。你必须注意,每一行上都可以有:只有文本、文本和数字,或者只有一个数字。您可以尝试将每一条线转换为float,如果失败则忽略它:

out=[]
for column in columns : 
    try:
        out.append("{:.2f}".format(float(column)))
    except ValueError:
        out.append(column)

下面是如何使用
格式
语法(新的python2/3格式语法)将一些浮点值转换为2位小数的字符串:

关于剩下的问题:您的代码似乎没有正确处理文本文件的格式。你必须注意,每一行上都可以有:只有文本、文本和数字,或者只有一个数字。您可以尝试将每一条线转换为float,如果失败则忽略它:

out=[]
for column in columns : 
    try:
        out.append("{:.2f}".format(float(column)))
    except ValueError:
        out.append(column)

如果可以假设需要舍入的浮动只在直线上发生,那么第一部分就很容易完成。这不包括前缀为alpha字符的行,例如
TS 3600.47

from __future__ import print_function

with open('data.txt') as f, open('output.txt', 'w') as outfile:
    for line in (l.rstrip() for l in f):
        try:
            print('{:.2f}'.format(float(line)), file=outfile)
        except ValueError:
            print(line, file=outfile)
但是,第二部分要求对整个文件进行缓冲,因为不知道
TS
的最大值在哪里-可能在文件的开头、结尾或两者之间的任何位置。下面是一些代码:

from __future__ import print_function

with open('data.txt') as f, open('output.txt', 'w') as outfile:
    lines = []
    max_ts = 0
    max_ts_idx = None

    for i, line in enumerate(l.rstrip() for l in f):
        try:
            lines.append('{:.2f}'.format(float(line)))
        except ValueError:
            if line.startswith('TS'):
                new_ts = float(line.split()[-1])
                if new_ts > max_ts:
                    max_ts = new_ts
                    max_ts_idx = i
            lines.append(line)

    for i, line in enumerate(lines):
        if i == max_ts_idx:
            line = line.replace('TS', 'TS**MAX**')
        print(line, file=outfile)

它基本上与上面的纯打印版本相同,但是,这些行现在已累积到列表
行中。“TS”行的最大值保存在
max\u TS
中,该“TS”行的对应行号保存在
max\u TS\u idx
中。最后迭代
列表,并将这些行写入文件。如果该行包含“TS”的最大值(由
max\u TS\u idx
确定),则该行用
**max**

装饰,如果可以假设需要舍入的浮动仅在行上发生,则可以轻松完成第一部分。这不包括前缀为alpha字符的行,例如
TS 3600.47

from __future__ import print_function

with open('data.txt') as f, open('output.txt', 'w') as outfile:
    for line in (l.rstrip() for l in f):
        try:
            print('{:.2f}'.format(float(line)), file=outfile)
        except ValueError:
            print(line, file=outfile)
但是,第二部分要求对整个文件进行缓冲,因为不知道
TS
的最大值在哪里-可能在文件的开头、结尾或两者之间的任何位置。下面是一些代码:

from __future__ import print_function

with open('data.txt') as f, open('output.txt', 'w') as outfile:
    lines = []
    max_ts = 0
    max_ts_idx = None

    for i, line in enumerate(l.rstrip() for l in f):
        try:
            lines.append('{:.2f}'.format(float(line)))
        except ValueError:
            if line.startswith('TS'):
                new_ts = float(line.split()[-1])
                if new_ts > max_ts:
                    max_ts = new_ts
                    max_ts_idx = i
            lines.append(line)

    for i, line in enumerate(lines):
        if i == max_ts_idx:
            line = line.replace('TS', 'TS**MAX**')
        print(line, file=outfile)

它基本上与上面的纯打印版本相同,但是,这些行现在已累积到列表
行中。“TS”行的最大值保存在
max\u TS
中,该“TS”行的对应行号保存在
max\u TS\u idx
中。最后迭代
列表,并将这些行写入文件。如果该行包含“TS”的最大值(由
max\u TS\u idx
确定),则该行用
**max**

装饰,非常感谢。我真的走错方向了。你能就以下问题给我一个提示吗。我试图重写rpogram,但它没有给我正确的答案。我还想找出第一个数、第二个数、第三个数、第四个数等等之间的最大数。。。。在TS下?非常感谢。我真的走错方向了。你能就以下问题给我一个提示吗。我试图重写rpogram,但它没有给我正确的答案。我还想找出第一个数、第二个数、第三个数、第四个数等等之间的最大数。。。。在TS下?