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. В то время как кажется довольно простым заменить определенные значения 'заменой ()' метод и некоторое время цикл, как дела это, если Вы хотите заменить диапазон?

спасибо

6
задан SilentGhost 21 April 2010 в 17:14
поделиться

6 ответов

Я думаю, когда вы начинаете программировать, полезно увидеть несколько примеров; и я предполагаю, что вы сначала попробовали решить эту проблему самостоятельно!

Вот пример того, как можно подойти к этому:

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'

Метод разделения работает со строками. Он возвращает список строк. По умолчанию он разбивается на пробелы:

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 ) к каждому из элементов своего второго аргумента (список строка_числа ). Функция 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, если число <1, иначе число) равно 1, если num меньше 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())]

Чтобы сгенерировать строку из элементов loaded_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'
7
ответ дан 8 December 2019 в 13:45
поделиться

типичный метод:

  • чтение файла строка за строкой
  • разделение каждой строки на список строк
  • преобразование каждой строки в число с плавающей запятой
  • сравнение преобразованного значения с 1
  • замена при необходимости
  • напишите ответ в новый файл

Поскольку я не вижу, чтобы у вас еще был код, я надеюсь, что это будет хорошим началом

4
ответ дан 8 December 2019 в 13:45
поделиться
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
3
ответ дан 8 December 2019 в 13:45
поделиться

У меня скрипт работает так, как я хочу ... спасибо людям. {{1} } При записи списка в новый файл я использовал метод replace, чтобы избавиться от скобок и запятых - есть ли способ попроще?

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()
0
ответ дан 8 December 2019 в 13:45
поделиться

Вы можете использовать регулярные выражения для анализа строки. Я предполагаю, что мантисса никогда не превышает 1 (т.е. начинается с 0). Это означает, что для того, чтобы число было меньше 1, показатель степени должен быть либо 0, либо отрицательным. Следующее регулярное выражение соответствует «0», «.», Неограниченному количеству десятичных цифр (минимум 1), «E» и либо «+00», либо «-» и двум десятичным цифрам.

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

Предполагая, что у вас есть файл, считанный в переменную 'text', вы можете использовать регулярное выражение со следующим кодом Python:

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

Изменить: только что понял, что описание не ограничивает допустимый диапазон входных чисел положительными числами . Отрицательные числа могут быть сопоставлены с помощью следующего регулярного выражения:

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

Его можно чередовать с первым, используя синтаксис (шаблон1 | шаблон2), что приводит к следующему коду Python:

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

Также, если есть вероятность, что экспонента проходит мимо 99, регулярное выражение можно дополнительно изменить, добавив знак «+» после шаблонов «\ d \ d». Это позволяет сопоставить цифры, заканчивающиеся двумя ИЛИ БОЛЕЕ цифрами.

0
ответ дан 8 December 2019 в 13:45
поделиться
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
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: