python:查找并替换数字< 1在文本文件中

时间:2010-04-21 17:09:56

标签: python replace

我对Python编程很陌生,并希望对我遇到的问题有所帮助......

基本上我有多个文本文件,其中包含速度值:

0.259515E + 03 0.235095E + 03 0.208262E + 03 0.230223E + 03 0.267333E + 03 0.217889E + 03 0.156233E + 03 0.144876E + 03 0.136187E + 03 0.137865E + 00

等许多行...

我需要做的是将文本文件中小于1的所有值(例如0.137865E + 00以上)转换为0.100000E + 01的任意值。虽然使用'replace()'方法和while循环替换特定值似乎很简单,但如果要替换范围,如何执行此操作?

感谢

6 个答案:

答案 0 :(得分:7)

我认为当你开始编程时,看一些例子很有用;我假设你已经自己尝试过这个问题了!

以下是您如何解决这个问题的细分:

contents='0.259515E+03 0.235095E+03 0.208262E+03 0.230223E+03 0.267333E+03 0.217889E+03 0.156233E+03 0.144876E+03 0.136187E+03 0.137865E+00'

split method适用于字符串。它返回一个字符串列表。默认情况下,它会在空格上分割:

string_numbers=contents.split()
print(string_numbers)
# ['0.259515E+03', '0.235095E+03', '0.208262E+03', '0.230223E+03', '0.267333E+03', '0.217889E+03', '0.156233E+03', '0.144876E+03', '0.136187E+03', '0.137865E+00']

map command将其第一个参数(函数float)应用于其第二个参数的每个元素(列表string_numbers)。 float函数将每个字符串转换为浮点对象。

float_numbers=map(float,string_numbers)
print(float_numbers)
# [259.51499999999999, 235.095, 208.262, 230.22300000000001, 267.33300000000003, 217.88900000000001, 156.233, 144.876, 136.18700000000001, 0.13786499999999999]

您可以使用list comprehension处理列表,将小于1的数字转换为数字1.当num小于1时,conditional expression (1 if num<1 else num)等于1,否则,它等于数。

processed_numbers=[(1 if num<1 else num) for num in float_numbers]
print(processed_numbers)
# [259.51499999999999, 235.095, 208.262, 230.22300000000001, 267.33300000000003, 217.88900000000001, 156.233, 144.876, 136.18700000000001, 1]

这是同一件事,全都在一行:

processed_numbers=[(1 if num<1 else num) for num in map(float,contents.split())]

要从processed_numbers的元素生成字符串,您可以使用str.join method

comma_separated_string=', '.join(map(str,processed_numbers))
# '259.515, 235.095, 208.262, 230.223, 267.333, 217.889, 156.233, 144.876, 136.187, 1'

答案 1 :(得分:4)

典型的技术是:

  • 逐行阅读文件
  • 将每一行拆分为字符串列表
  • 将每个字符串转换为float
  • 将转换后的值与1
  • 进行比较
  • 在需要时更换
  • 回写新文件

由于我没有看到你有任何代码,我希望这将是一个良好的开端

答案 2 :(得分:3)

def float_filter(input):
    for number in input.split():
        if float(number) < 1.0:
            yield "0.100000E+01"
        else:
            yield number

input = "0.259515E+03 0.235095E+03 0.208262E+03 0.230223E+03 0.267333E+03 0.217889E+03 0.156233E+03 0.144876E+03 0.136187E+03 0.137865E+00"
print " ".join(float_filter(input))

答案 3 :(得分:3)

import numpy as np

a = np.genfromtxt('file.txt')  # read file
a[a<1] = 0.1                   # replace
np.savetxt('converted.txt', a) # save to file

答案 4 :(得分:0)

您可以使用正则表达式来解析字符串。我在这里假设尾数永远不会大于1(即从0开始)。这意味着,如果数字小于1,则指数必须为0或负数。以下正则表达式匹配'0','。',无限小数位数(至少1),'E'和'+00'或' - '以及两位小数。

0\.\d+E(-\d\d|\+00)

假设您将文件读入变量'text',您可以使用带有以下python代码的regexp:

result = re.sub(r"0\.\d*E(-\d\d|\+00)", "0.100000E+01", text)

编辑:刚刚意识到描述并没有将输入数字的有效范围限制为正数。负数可以与以下正则表达式匹配:

-0\.\d+E[-+]\d\d

这可以使用(pattern1 | pattern2)语法替换第一个语法,从而产生以下Python代码:

result = re.sub(r"(0\.\d+E(-\d\d|\+00)|-0\.\d+E[-+]\d\d)", "0.100000E+00", subject)

此外,如果指数有可能超过99,则可以通过在'\ d \ d'模式后添加'+'符号来进一步修改正则表达式。这允许匹配以两个或更多数字结尾的数字。

答案 5 :(得分:0)

我已经按照我现在的要求运行脚本了...感谢大家。 将列表写入新文件时,我使用了替换方法来删除括号和逗号 - 是否有更简单的方法?

ftext = open("C:\\Users\\hhp06\\Desktop\\out.grd", "r")
otext = open("C:\\Users\\hhp06\\Desktop\\out2.grd", "w+")

for line in ftext:
    stringnum = line.split()
    floatnum = map(float, stringnum)
    procnum = [(1.0 if num<1 else num) for num in floatnum]
    stringproc = str(procnum)
    s = (stringproc).replace(",", " ").replace("[", "  ").replace("]", "")
    otext.writelines(s + "\n")
otext.close()