Изменить число в одном файле если оно равно числу в другом файле

297 просмотра
0
0 Комментариев

У меня имеются два файла:

1.txt

0.12
0.32
0.44
0.56
0.60

2.txt

0.13
0.44
0.60

Нужно изменить файл 1.txt в следующее:

0.12
0.32
0.439
0.56
0.599

где 0.599 может иметь сколько угодно чисел после запятой. Основная задача, чтобы оно было меньше 0.60.

Мой код:

with open('1.txt') as phone_file, \
     open('2.txt') as syl_file:
 
    for line_p in phone_file:
        for line_s in syl_file:
            if line_p == line_s:
                line_p = line_s-0.001
 
            print(line_p)


Добавить комментарий

4 Answers

Python Опубликовано 10.12.2018
0

Можно numpy.isin(a, b) использовать, чтобы узнать какие элементы из a равны элементам из b (какие значения нужно уменьшить в текущей задаче):

#!/usr/bin/env python
import numpy as np
 
a = np.loadtxt('numbers.txt')
bins = np.loadtxt('bins.txt')
 
a[np.isin(a, bins)] -= .001
 
np.savetxt('output.txt', a, '%g')

Вывод:

0.12
0.32
0.439
0.56
0.599

Вариант, который использует тот факт, что элементы отсортированы, вызывая numpy.searchsorted():

#!/usr/bin/env python
import numpy as np
 
a = np.loadtxt('numbers.txt')
bins = np.loadtxt('bins.txt')
 
ind = np.searchsorted(a, bins)
eq = a[ind]
eq[eq == bins] -= .001
a[ind] = eq
 
np.savetxt('output.txt', a, '%g')

Тот же результат.

Добавить комментарий
0

output = []    # Список выходных строк
 
with open('1.txt') as phone_file, \
     open('2.txt') as syl_file:
 
    # Вытаскиваем строки из текстовых файлов,
    # обрезая перевод строки и пробелы
    p_lines = [line.strip() for line in phone_file]
    s_lines = [line.strip() for line in syl_file]
 
    for line_p in p_lines:
        new_p = float(line_p)-0.001 if line_p in s_lines else float(line_p)
        output.append(str(new_p))
 
# Теперь открываем файл только для записи
with open('1.txt', 'w') as phone_file:
    for line in output:
        # И вставляем в него получившиеся числа
        phone_file.write(str(line) + '\n')

Добавить комментарий
0

Чтобы по месту изменения делать, можно fileinput модуль использовать (print печатает в файл, см. Как заменить строчку в .txt файле через python 3?):

#!/usr/bin/env python3
from fileinput import FileInput
from math import inf
 
with FileInput('numbers.txt', inplace=True, backup='.bak') as numbers_file, \
     open('bins.txt') as bins_file:
    bins = map(float, bins_file)
    b = next(bins)
    # assume sorted and all numbers are within bins range
    for x in map(float, numbers_file):
        while x > b:
            b = next(bins)
        if x == b:
            x = nextafter(x, -inf) # previous
        print(x)

Результат:

0.12
0.32
0.43999999999999995
0.56
0.5999999999999999

Здесь nextafter() функция используется, чтобы найти float, которое меньше заданного. На CPython, можно из Си библиотеки её повзаимствовать:

import ctypes
 
libc = ctypes.CDLL(None)
nextafter = libc.nextafter
nextafter.restype = ctypes.c_double
nextafter.argtypes = [ctypes.c_double, ctypes.c_double]

чтобы получить результат как в вопросе, вы можете определить: nextafter = lambda x, y: x - .001

Добавить комментарий
0

С использованием Pandas модуля:

import pandas as pd
 
# read up files into Pandas.Series variables
s1 = pd.read_csv(r'1.txt', header=None, squeeze=True)
s2 = pd.read_csv(r'2.txt', header=None, squeeze=True)
 
delta = 1e-6
 
# subtract [delta] from matchig elements
s1.loc[s1.isin(s2)] -= delta
 
# overwrite [1.txt] with modified data
s1.to_csv(r'1.txt', header=None, index=False)

Содержимое обновленного файла:

In [14]: print(open(r'1.txt').read())
0.12
0.32
0.43999900000000003
0.56
0.599999

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up