Найти - Пользователи
Полная версия: Замена слова в файле.
Начало » Python для новичков » Замена слова в файле.
1 2
Dmitriy_Z
Добрый день. Необходимо заменить в формализованном файле слово “00000” на соответствующее значение из другой строки. Файл представляет собой список, где формат записи повторяется каждые 3 строки:
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 00000 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 00000 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 00000 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179

Необходимо заменить “00000” на первой позиции третьей строки (не считая “2”) на первые 5 цифр второй строки (не считая “1”).

Ниже пример что должно получится:

Исходный текст:
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
Результат:
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465

Сложность в том, что в тексте есть еще стоки “00000” и их менять не нужно. Если я правильно думаю, то необходимо считать каждую третью строку и сделать в них замену, затем записать обратно на свои места?Либо поставить соответствие “00000” третьей строки и “45857” второй строки с указанием конкретной позиции в файле? Помогите необразованному)
marvellik
Dmitriy_Z
считать каждую третью строку и сделать в них замену
конечно если вам именно это нужно
Dmitriy_Z
marvellik
я не знаю как это реализовать
py.user.next
На awk можно преобразовать
[guest@localhost rep]$ ls
file.txt rep.awk
[guest@localhost rep]$ cat rep.awk
BEGIN {
state = 1
}
state == 1 {
state = 2
print
next
}
state == 2 {
state = 3
number = $2
sub(/[0-9]{5}/, "&|", number)
sub(/\|.*$/, "", number)
print
next
}
state == 3 {
state = 1
$2 = number
print
next
}
[guest@localhost rep]$
[guest@localhost rep]$ cat file.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 00000 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 00000 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 00000 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
[guest@localhost rep]$ awk -f rep.awk file.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 45727 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 45856 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 45753 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
[guest@localhost rep]$ awk -f rep.awk file.txt >out.txt
[guest@localhost rep]$
[guest@localhost rep]$ cat out.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 45727 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 45856 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 45753 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
Dmitriy_Z
py.user.next
На awk можно преобразовать
Изучаю питон, с AWK не знаком.
Dmitriy_Z
Dmitriy_Z
НУжно считывать и вторую строку чтобы из нее взять значение для замены “00000” в третьей строке.
py.user.next
Dmitriy_Z
Изучаю питон, с AWK не знаком.
Ну, это классическая программа в компьютерном мире, как и Sed. То есть для трансляции вот таких текстовых данных лучше изучить эти программы, им больше сорока лет. И вообще надо перейти на Linux, там эти все программы есть изначально, ничего не надо искать и доустанавливать.

А если тебе нужно на питоне, то можно и на питоне. Сам будешь делать? Или кто-нибудь на тебе, как на кошке, потренируется, попробует всё это сделать, а потом я покажу, как надо на самом деле это сделать, чтобы все мы потренировались?
Dmitriy_Z
py.user.next
давай лучше сразу результат. Если можно то с комментариями чтобы я мог сам разобраться.
py.user.next
Ну, новички пусть сначала попробуют свои силы.
AD0DE412
 def one(fd):
    file = open(fd, 'r')
    try:
        while file:
            str1 = file.readline()
            str2 = file.readline()
            str3 = file.readline()
            tmp = str3.split(" ")
            if tmp[1] == "0"*5:
                tmp[1] = str2.split(" ")[1][:5]
                str3 = " ".join(tmp)
            yield str1
            yield str2
            yield str3
    except IndexError:
        print('Check up the entered data!!!')
    except Exception as err:
        print(err)
    file.close()
print(*one('in.txt'))
def two(seq, fd):
    file = open(fd, 'w')
    for i in seq:
        file.writelines(i)
    file.close()
two(one('in.txt'), 'out.txt')

ps чт сегодня туплю поэтому попросще
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB