python: найти и заменить числа <1 в текстовом файле - PullRequest
6 голосов
/ 21 апреля 2010

Я довольно новичок в программировании на 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 ]

7 голосов
/ 21 апреля 2010

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

Вот пример того, как вы могли бы подойти к этому:

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) к каждому из элементов своего второго аргумента (список 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) равно 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'
4 голосов
/ 21 апреля 2010

Типичная методика будет такой:

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

Поскольку у вас пока нет кодаНадеюсь, это будет хорошим началом

3 голосов
/ 22 апреля 2010
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 голосов
/ 21 апреля 2010
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))
0 голосов
/ 22 апреля 2010

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

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 голосов
/ 21 апреля 2010

Вы можете использовать регулярные выражения для анализа строки.Здесь я предполагаю, что мантисса никогда не бывает больше 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

Это можно чередовать с первым с использованием синтаксиса (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».Это позволяет сопоставлять цифры, заканчивающиеся двумя или более цифрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...