Использование line.replace в Python3 для перенумеровки последовательности чисел

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть выходной файл из другой части кода:

1434 CPM 3.958 20.716 72.669 94 1438 1465
1435 CPM 1.836 16.422 71.695 94 1441 1448
1436 CPM 2.634 17.182 67.015 94 1451 1455
1437 CPM 4.132 21.733 67.897 94 1458 1462
1438 CPB 3.349 19.474 72.781 93 1434 1439 1472
1439 CPA 3.118 18.784 74.036 92 1438 1440 1443
1440 CPA 2.552 17.612 73.778 92 1439 1441 1442
1441CPB 2.378 17.502 72.348 93 1435 1440 1472
1442 CT3 2.158 16.567 74.855 27 1440
1443 CT2 3.485 19.307 75.452 26 1439 1444
1444 CT2 2.553 20.439 75.889 26 1443 1445
1445 CM 2.317 20.343 77.375 96 1444 1446 1447
1446 OH1 2.873 19.416 78.015 76 1445
1447 ОМ 1.582 21.197 77.930 105 1445
1448 CPB 1.923 16.208 70.337 931435 1449 1473
1449 CPA 1.600 14.991 69.612 92 1448 1450 1452
1450 CPA 1.816 15.216 68.315 92 1449 1451 1453
1451 CPB 2.285 16.572 68.185 93 1436 1450 1473
1452 CT3 1.091 13.691 70.273 27 1449
1453 C 1.653 14.262 67.103 95 1450 1454
1454 C 0.582 13.482 66.929 95 1453
1455 CPB 3.119 18.452 66.894 93 1436 1456 1474
1456 CPA 3.538 19.007 65.645 92 1455 1457 1459
1457 CPA 3.944 20.244 65.858 92 1456 1458 1460
1458 CPB 3,803 20,546 67,268 93 1437 1457 1474
1459 CT33.556 18.278 64.284 27 1456
1460 C 4.486 21.151 64.731 95 1457 1461
1461 C 4.266 22.469 64.758 95 1460
1462 CPB 4.362 21.866 69.256 93 1437 1463 1475
1463 CPA 5.109 22.925 69.918 92 1462 1464 1466
1464 CPA 5.050 22.612 71.413 92 1463 1465 1467
1465 КПБ 4.294 21.373 71.505 93 1434 1464 1475
1466 КТ3 5.789 24.12969.239 27 1463
1467 CT2 5.685 23.426 72.579 26 1464 1468
1468 CT2 4.623 23.904 73.582 26 1467 1469
1469 СМ 4.434 25.412 73.527 96 1468 1470 1471
1470 OH1 4,822 26,053 72,525 76 1469
1471 OM 3,847 25,982 74,474 105 1469
1472 NPH 2,870 18,669 71,752 100 1438 1441 1476
1473 NPH 2,335 17,156 69,426 100 1448 1451 1476
1474 NPH 3,284 19,422 67,889 100 1455 1458 1476
1475 NPH 3,914 20,981 70,226 100 1462 1465 1476
1476 ФЕ 2,826 19,201 69,829107 822 1472 1473 1474

Что мне нужно сделать, это перенумеровать с 1434 на другое число (например, 3168 в данном случае) и заменить каждый экземпляр этого числа.Затем перейдите к следующему номеру (1435) и измените его и каждый его экземпляр на следующий номер в последовательности (3169). То, что я написал до сих пор:

 def renumber_xyz():
    file_name = "output1.txt"
    f1 = open(file_name, "rt")
    f2 = open("output2.txt", "wt")
    lines = f1.readlines()
    
    i = 1434
    j = 3168
    for line in lines:
        f2.write(line.replace(str(i), str(j)))
        
        i = int(i)   1
        j = int(j)   1
        
    f1.close()
    f2.close()  

renumber_xyz()
  

Однако это изменяет только один экземпляр каждого числа:

3168 CPM 3.958 20.716 72.669 94 1438 1465
3169 CPM 1.836 16.422 71.695 94 1441 1448
3170 CPM 2.634 17.182 67.015 94 1451 1455
3171 CPM 4.132 21.733 67.897 94 1458 1462
3172 CPB 3.349 19.474 72.781 93 1434 1439 1472
3173 CPA 3.118 18.784 74,036 92 1438 1440 1443
3174 CPA 2,552 17,612 73,778 92 1439 1441 1442
3175CPB 2.378 17.502 72.348 93 1435 1440 1472
3176 CT3 2.158 16.567 74.855 27 1440
3177 CT2 3.485 19.307 75.452 26 1439 1444
3178 CT2 2.553 20.439 75.889 26 1443 1445
3179 CM 2.317 20.343 77.375 96 1444 1446 1447
3180 OH1 2.873 19.416 78.015 76 1445
3181 ОМ 1.582 21.197 77.930 105 1445
3182 КПБ 1.923 16.208 70.337 931435 1449 1473
3183 CPA 1.600 14.991 69.612 92 1448 1450 1452
3184 CPA 1.816 15.216 68.315 92 1449 1451 1453
3185 CPB 2.285 16.572 68.185 93 1436 1450 1473
3186 CT3 1.091 13.691 70.273 27 1449
3187 C 1.653 14.262 67.103 95 1450 1454
3188 C 0.582 13.482 66.929 95 1453
3189 CPB 3.119 18.452 66.894 93 1436 1456 1474
3190 CPA 3.538 19.007 65.645 92 1455 1457 1459
3191 CPA 3.944 20.244 65.858 92 1456 1458 1460
3192 CPB 3,803 20,546 67,268 93 1437 1457 1474
3193 КТ33.556 18.278 64.284 27 1456
3194 C 4.486 21.151 64.731 95 1457 1461
3195 C 4.266 22.469 64.758 95 1460
3196 CPB 4.362 21.866 69.256 93 1437 1463 1475
3197 CPA 5.109 22.925 69.918 92 1462 1464 1466
3198 CPA 5.050 22.612 71.413 92 1463 1465 1467
3199 CPB 4.294 21.373 71.505 93 1434 1464 1475
3200 CT3 5.789 24.12969.239 27 1463
3201 CT2 5.685 23.426 72.579 26 1464 1468
3202 CT2 4.623 23.904 73.582 26 1467 1469
3203 CM 4.434 25.412 73.527 96 1468 1470 1471
3204 OH1 4,822 26,053 72,525 76 1469
3205 OM 3,847 25,982 74,474 105 1469
3206 NPH 2,870 18,669 71,752 100 1438 1441 1476
3207 NPH 2,335 17,156 69,426 100 1448 1451 1476
3208 NPH 3,284 19,422 67,889 100 1455 1458 1476
3209 NPH 3,914 20,981 70,226 100 1462 1465 1476
3210 ФЕ 2,826 19,201 69,829107 822 1472 1473 1474

Пожалуйста, извините за мой любительский код, я не программист! Спасибо за любую помощь!!

Ответ №1:

Вы не можете выполнять замену построчно; вам нужно прочитать весь файл в строку и выполнить замены в этой единственной строке.

Этот код использует регулярное выражение для поиска всех чисел, которые начинаются с каждой строки, без указания начального и конечного диапазона.

 import re


def renumber_xyz():
    # Use "with" context managers and the files will be closed at the end of the block
    with open("output1.txt", "rt") as f1, open("output2.txt", "wt") as f2:
        lines = f1.read()
        numbers = re.findall(r'^d ', lines, re.M) # find numbers at start of a line
        replacement = 3168
        for number in numbers:
            lines = lines.replace(number, str(replacement))
            replacement  = 1
        f2.write(lines)

renumber_xyz()
  

Если вы хотите жестко запрограммировать диапазон чисел:

 def renumber_xyz():
    # Use "with" context managers and the files will be closed at the end of the block
    with open("output1.txt", "rt") as f1, open("output2.txt", "wt") as f2:
        lines = f1.read()
        replacement = 3168
        for number in range(1434, 1477):
            lines = lines.replace(str(number), str(replacement))
            replacement  = 1
        f2.write(lines)

renumber_xyz()
  

output2.txt:

 3168 CPM 3.958 20.716 72.669 94 3172 3199
3169 CPM 1.836 16.422 71.695 94 3175 3182
3170 CPM 2.634 17.182 67.015 94 3185 3189
3171 CPM 4.132 21.733 67.897 94 3192 3196
3172 CPB 3.349 19.474 72.781 93 3168 3173 3206
3173 CPA 3.118 18.784 74.036 92 3172 3174 3177
3174 CPA 2.552 17.612 73.778 92 3173 3175 3176
3175 CPB 2.378 17.502 72.348 93 3169 3174 3206
3176 CT3 2.158 16.567 74.855 27 3174
3177 CT2 3.485 19.307 75.452 26 3173 3178
3178 CT2 2.553 20.439 75.889 26 3177 3179
3179 CM 2.317 20.343 77.375 96 3178 3180 3181
3180 OH1 2.873 19.416 78.015 76 3179
3181 OM 1.582 21.197 77.930 105 3179
3182 CPB 1.923 16.208 70.337 93 3169 3183 3207
3183 CPA 1.600 14.991 69.612 92 3182 3184 3186
3184 CPA 1.816 15.216 68.315 92 3183 3185 3187
3185 CPB 2.285 16.572 68.185 93 3170 3184 3207
3186 CT3 1.091 13.691 70.273 27 3183
3187 C 1.653 14.262 67.103 95 3184 3188
3188 C 0.582 13.482 66.929 95 3187
3189 CPB 3.119 18.452 66.894 93 3170 3190 3208
3190 CPA 3.538 19.007 65.645 92 3189 3191 3193
3191 CPA 3.944 20.244 65.858 92 3190 3192 3194
3192 CPB 3.803 20.546 67.268 93 3171 3191 3208
3193 CT3 3.556 18.278 64.284 27 3190
3194 C 4.486 21.151 64.731 95 3191 3195
3195 C 4.266 22.469 64.758 95 3194
3196 CPB 4.362 21.866 69.256 93 3171 3197 3209
3197 CPA 5.109 22.925 69.918 92 3196 3198 3200
3198 CPA 5.050 22.612 71.413 92 3197 3199 3201
3199 CPB 4.294 21.373 71.505 93 3168 3198 3209
3200 CT3 5.789 24.129 69.239 27 3197
3201 CT2 5.685 23.426 72.579 26 3198 3202
3202 CT2 4.623 23.904 73.582 26 3201 3203
3203 CM 4.434 25.412 73.527 96 3202 3204 3205
3204 OH1 4.822 26.053 72.525 76 3203
3205 OM 3.847 25.982 74.474 105 3203
3206 NPH 2.870 18.669 71.752 100 3172 3175 3210
3207 NPH 2.335 17.156 69.426 100 3182 3185 3210
3208 NPH 3.284 19.422 67.889 100 3189 3192 3210
3209 NPH 3.914 20.981 70.226 100 3196 3199 3210
3210 FE 2.826 19.201 69.829 107 822 3206 3207 3208
  

Комментарии:

1. Спасибо! Жесткое кодирование в числах на самом деле идеально, потому что есть вероятность, что для будущих наборов данных это перенумерование будет в середине ряда чисел.

Ответ №2:

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

 def renumber_xyz():
    file_name = "output1.txt"
    f1 = open(file_name, "rt")
    f2 = open("output2.txt", "wt")
    text = f1.read()

    # Iterate through each number i that needs replacing
    for i in range(1434, 1477):
      # Replace all occurrences in the entire file
      text = text.replace(str(i), str(i 1734))

    f2.write(text)
    
    f1.close()
    f2.close()

renumber_xyz()
  

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