Python File String Заменить Dict и Tuple - PullRequest
0 голосов
/ 26 октября 2018

имеют Dict с несколькими значениями в кортеже.

newhost = {'newhost.com': ('1.oldhost.com',
                   '2.oldhost.com',
                   '3.oldhost.com',
                   '4.oldhost.com')
        }

Я хочу открыть существующий файл и найти в нем строки, содержащие значение oldhosts. Файл может иметь несколько строк аккаунта. В примере Аккаунт: 1.oldhost.com имя пользователя Аккаунт: имя пользователя someotherhost Когда найдена строка с 1.oldhost.com или 2.oldhost.com или 3.oldhost.com и т. Д., Я хочу заменить ее ключом из dict newhost.com.

Кто-нибудь может мне помочь? Много искал, но не нашел нужную вещь.

Привет

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

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

# your current structure
new_hosts = {
    'newhost-E.com': (
        '1.oldhost-E.com',
        '2.oldhost-E.com',
    ),
    'newhost-A.com': (
        '1.oldhost-A.com',
        '2.oldhost-A.com',
        '3.oldhost-A.com',
    ),
}

# my proposal
new_hosts_2 = {
    v: k
    for k, v_list in new_hosts.items()
    for v in v_list}
print(new_hosts_2)
# {
#     '1.oldhost-E.com': 'newhost-E.com',
#     '2.oldhost-E.com': 'newhost-E.com',
#     '1.oldhost-A.com': 'newhost-A.com',
#     '2.oldhost-A.com': 'newhost-A.com',
#     '3.oldhost-A.com': 'newhost-A.com',
# }

Это повторяет новые имена хостов (значения в new_hosts_2), но это позволит вам быстро искать по старому имени хоста:

some_old_host = 'x.oldhost.com'
the corresponding_new_host = new_hosts_2[some_old_host]

Теперь вам просто нужно:

  • читать строки файла
  • найти старое имя хоста в этой строке
  • поиск соответствующего нового хоста в new_hosts_2
  • заменить это значение в строке
  • записать строку в новый файл

Может быть так:

with open(file_name_1, 'r') as fr:
    with open(file_name_2, 'w') as fw:
        for line in fr:
            line = line.strip()
            if len(line) > 0:
                # logic to find the start and end position of the old host
                start_i = ?
                end_i = ?

                # get and replace, but only if its found in 'new_hosts_2'
                old_host = line[start_i:end_i]
                if old_host in new_hosts_2:
                    line = line[:start_i] + new_hosts_2[old_host] + line[end_i:]

                fw.write(line + '\n')
0 голосов
/ 27 октября 2018

Спасибо за ваши советы.Я пришел с этим сейчас, и он работает нормально.

import fileinput
textfile = 'somefile.txt'
curhost = 'newhost.com'

hostlist = {curhost: ('1.oldhost.com',
                       '2.oldhost.com',
                       '3.oldhost.com')
                 }

new_hosts_2 = {
    v: k
    for k, v_list in hostlist.items()
    for v in v_list}

for line in fileinput.input(textfile, inplace=True):
    line = line.rstrip()
    if not line:
        continue
    for f_key, f_value in new_hosts_2.items():
        if f_key in line:
            line = line.replace(f_key, f_value)
    print line
0 голосов
/ 26 октября 2018

Может быть, что-то подобное может начать вас

infile_name = 'some_file.txt'
# Open and read the incoming file
with open(infile_name, 'r') as infile:
    text = infile.read()

# Cycle through the dictionary
for newhost, oldhost_list in host_dict.items():
    # Cycle through each possible old host
    for oldhost in oldhost_list:
        text.replace(oldhost, newhost)

outfile_name = 'some_other_file.txt'
# Write to file
with open(outfile_name, 'w') as outfile:
    outfile.write(text)

Не претендую на то, что это лучшее решение, но оно должно стать хорошим началом для вас.

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