我对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循环替换特定值似乎很简单,但如果要替换范围,如何执行此操作?
感谢
答案 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)
典型的技术是:
由于我没有看到你有任何代码,我希望这将是一个良好的开端
答案 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()