Замените числа с плавающей запятой в текстовых файлах - PullRequest
2 голосов
/ 05 марта 2020

Я хочу найти и заменить числа с плавающей точкой целыми числами в нескольких текстовых файлах.
В текстовом файле есть одно значение числа с плавающей точкой, которое я хочу преобразовать. Это всегда после указанного c ключевого слова и должно быть умножено на 10.000.
например, число с плавающей точкой 1.5 должно быть превращено в целое число 15.000
Другие значения с плавающей точкой после 1.5 не должны быть изменены, хотя

def edit(file):
    with open(file, 'r') as f:
        filedata = f.read()
        for line in filedata:
           if "keyword" in line:
              filedata = filedata.replace(re.search(r"\d+\.\d+", line).group(), str(10000*re.search(r"\d+\.\d+", line).group()))
    with open(file, 'w') as f:
        f.write(filedata)

Я пытался заменить число с помощью регулярного выражения. Но это не работает

ПРИМЕР ЭКСТРАКТА ФАЙЛА

abcdef 178 211 208 220    
ghijkl 0 0 0 0  
keyword 1.50 1.63 1.56 1.45

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы можете перебирать строки с lines = filedata.split("\n"). Будьте осторожны, потому что filedata - это большая строка, содержащая весь файл. Когда вы сделали for line in filedata, вы перебрали все символы в файле ...

Я также использовал другой способ (без regex), чтобы найти числа и изменить их.

def edit(file):
    with open(file, "r") as f:
        filedata = f.read()
        lines = filedata.split("\n") # list of lines
        for index, line in enumerate(lines):
            if "keyword" in line:
                words = line.split() # ['keyword', '1.50', '1.63', '1.56', '1.45']
                for i, w in enumerate(words):
                    try:
                        # transform number to float, multiply by 10000
                        # then transform to integer, then back to string
                        new_word = str(int(float(w)*10000))
                        words[i] = new_word
                    except:
                        pass
                lines[index] = " ".join(words)
        new_data = "\n".join(lines) # store new data to overwrite file


    with open(file, "w") as f: # open file with write permission
        f.write(new_data) # overwrite the file with our modified data

edit("myfile.txt")

Вывод:

# myfile.txt
abcdef 178 211 208 220    
ghijkl 0 0 0 0  
keyword 15000 16299 15600 14500

РЕДАКТИРОВАТЬ : более компактный способ

def edit(file):
    with open(file, "r") as f:
        filedata = f.read()
        line = [x for x in filedata.split("\n") if "keyword" in x][0]
        new_line = line
        for word in line.split():
            try: new_line = new_line.replace(word, str(int(float(word)*10000)))
            except: pass
    with open(file, "w") as f: # open file with write permission
        f.write(filedata.replace(line, new_line)) # overwrite the file with our modified data

edit("myfile.txt")
1 голос
/ 05 марта 2020

Когда вы используете регулярное выражение внутри al oop, вы должны скомпилировать его вместо l oop.

Далее, если вы хотите заменить значение в строке, вы не должны Ищите его во всем файле.

Наконец, вы должны привести строку к типу цифр c, чтобы работать с ним. Если вы этого не сделаете, вы просто повторите строку ('10' * 2 - это '1010' не 20 или '20')

Вот возможное улучшение вашего кода:

def edit(file):
    with open(file, 'r') as f:
        rx = re.compile(r"\d+\.\d+")        # compile the regex only once
        filedata = f.readlines()            # get a list of the lines of the file
        for i, line in enumerate(filedata): # and enumerate them
            if "keyword" in line:
                val = re.search(r"\d+\.\d+", line).group()   # split the complex line
                newval = str(int(float(val) * 10000))
                filedata[i] = line.replace(val, newval)      # replace only the current line
                break                                        # no need to proceed further
    with open(file, 'w') as f:
        f.write(filedata)
...