Как изменить строку в Python, не используя fileinput на месте? - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу заменить символ в каждой строке, когда строка совпадает с моим lookup_keyword. Мне удалось придумать следующие решения. Но finaljoin записывает только изменения в новый файл (записывается только измененная строка)

Как я могу написать незатронутую строку вместе в новом файле?

Я знаю, что мы можем использовать fileinput inplace edit, но это больше подходит для замены ключевых слов.

Example input file,
123456789 [Thanos]
123456789 [Thanos]
123456789 [Thor]
123456789 [Loki]

Example output file,
1AA345KK789 [Thanos]
1AA345KK789 [Thanos]



Expected output file that I actually wanted.
1AA345KK789 [Thanos]
1AA345KK789 [Thanos]
123456789 [Thor]
123456789 [Loki]




lookup_keyword= "Thanos"

with open(filename) as myFile:
    # myFile,1 means start reading the line at line number one.
    # By default python will read start from 0.
    for num, line in enumerate(myFile, 1):
        if lookup_keyword in line:
            #print ('Found at line:', num)
            s = list(line)
            s[1] = 'AA'
            s[5] = 'KK'

            # join the list to a original string form
            finaljoin = "".join(s)

            #print (finaljoin)
            with open(new_filename, 'a+') as f:
                f.write(finaljoin)

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

input_file.txt

Example input file,
123456789 [Thanos]
123456789 [Thanos]
123456789 [Thor]
123456789 [Loki]    

Script.py

input_file_name = 'input_file.txt'
output_file_name = 'output_file.txt'

lookup_keyword= "Thanos"

with open(input_file_name) as input_file:
    next(input_file)        # skip first line
    with open(output_file_name, 'w') as output_file:
        for input_line in input_file:
            if lookup_keyword in input_line:
                input_list = list(input_line)
                input_list[1] = 'AA'
                input_list[5] = 'KK'

                output_line = ''.join(input_list)
            else:
                output_line = input_line

            output_file.write(output_line) 
0 голосов
/ 30 апреля 2018

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

Если Thanos находится в строке, вы изменяете строку, открываете выходной файл и добавляете измененную строку к нему.

Но если нет, вы ничего не делаете, поэтому ничего не пишется.

Вы можете исправить это так:

for num, line in enumerate(myFile, 1):
    #print ('Found at line:', num)
    s = list(line)
    if lookup_keyword in line:
        s[1] = 'AA'
        s[5] = 'KK'
    # join the list to a original string form
    finaljoin = "".join(s)

    #print (finaljoin)
    with open(new_filename, 'a+') as f:
        f.write(finaljoin)

Таким образом, вы всегда создаете новую строку и добавляете ее в новый файл, независимо от того, изменили вы его или нет.

В качестве альтернативы:

for num, line in enumerate(myFile, 1):
    if lookup_keyword in line:
        #print ('Found at line:', num)
        s = list(line)
        s[1] = 'AA'
        s[5] = 'KK'

        # join the list to a original string form
        finaljoin = "".join(s)
    else:
        finaljoin = line
    with open(new_filename, 'a+') as f:
        f.write(finaljoin)

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

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