python:在文本文件中查找并替换小于1的数字
我刚开始学习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()'方法和一个循环来替换特定值看起来很简单,但如果我想替换一系列的值,该怎么做呢?
谢谢
6 个回答
这段代码的意思是……
首先,它会做一些检查,看看输入的内容是否符合要求。如果不符合,就会给出错误提示。
接下来,它会处理这些输入,进行一些计算或者转换,最后输出结果。
整个过程就像是在做一道数学题,先检查条件,再进行计算,最后得出答案。
如果你对某些部分不太明白,可以随时问我哦!
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))
通常的做法是:
- 逐行读取文件
- 把每一行分割成一个字符串列表
- 将每个字符串转换成浮点数
- 把转换后的数值和1进行比较
- 在需要的时候进行替换
- 把结果写回到一个新文件中
因为我看到你还没有写任何代码,希望这些步骤能给你一个好的开始。
我觉得当你刚开始学习编程时,看到一些例子会很有帮助;我假设你已经先自己尝试过这个问题了!
下面是你可以尝试解决这个问题的一些步骤:
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方法是用在字符串上的。它会返回一个字符串列表。默认情况下,它会根据空格来分割字符串:
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命令会把第一个参数(函数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]
你可以使用列表推导式来处理这个列表,把小于1的数字都变成1。条件表达式 (1 if num<1 else num)
的意思是:当num小于1时,它的值为1,否则就是num本身。
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
方法:
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'