J'ai un fichier (sysid.txt) composé de plusieurs lignes de données (systemid et hostname) comme suit

0192.4500.0000 uue01.re1                              
0192.4500.0010 ccu01.re1                              
0192.4500.0110 uue02.re1                               
0192.4500.0001 core1.re2                                   

Basé sur info et aide ici, la 1ère chaîne (numéros) remplace avec succès comme requis mais la 2ème chaîne (nom d'hôte) est manquante et la sortie présentée en une seule ligne lorsque j'exécute le code ci-dessous.

file1 = open('sysid.txt', 'r')
file2 = open('sysip.txt', 'w')
file1_cont = file1.readlines()
for line in file1_cont:
    line = line.replace('.', '')
    f = itemgetter(slice(0,3), slice(3,6), slice(6,9), slice(9,12))
    line = '.'.join(f(line.replace('.','')))
    line = '{}.{}.{}.{}'.format(*map(int, f(line.replace('.', ''))))
    file2.write(line)
    print(line)

La sortie de sysip.txt

10.89.0.010.89.0.110.89.0.3210.89.0.3310.89.0.3410.89.0.3510.89.0.64

Lisez chaque ligne, je voudrais remplacer la 1ère chaîne (chiffres) et conserver la 2ème chaîne (nom d'hôte) comme ci-dessous

192.45.0.0 uue01.re1                              
192.45.0.10 ccu01.re1                              
192.45.0.110 uue02.re1                               
192.45.0.1 core1.re2

Comment puis-je manipuler la 1ère chaîne / numéros et enregistrer la ligne de sortie (file2.write (ligne)) dans une nouvelle ligne et en même temps rester la 2ème chaîne comme ci-dessus.

Merci pour votre soutien et vos conseils.

List.txt mis à jour ...

System ID      Hostname                                        
0192.4500.0000 uue01.re1                              
0192.4500.0010 ccu01.re1                              
0192.4500.0110 uue02.re1                               
0192.4500.0001 core1.re2 

{master}
0
chenoi 19 mars 2019 à 10:16

2 réponses

Meilleure réponse

List.txt:

0192.4500.0000 uue01.re1                              
0192.4500.0010 ccu01.re1                              
0192.4500.0110 uue02.re1                               
0192.4500.0001 core1.re2   

D'où :

def removeZeros(ip):
    # splits the ip by "."
    # converts the words to integeres to remove leading removeZeros
    # convert back the integer to string and join them back to a string
    new_ip = ".".join([str(int(i)) for i in ip.split(".")])
    return new_ip

logFile = "list.txt"
with open(logFile) as f:
    content = f.readlines()
# you may also want to remove empty lines
content = [l.strip() for l in content if l.strip()]

for line in content:
    line = line[1:].split(" ")[0]
    line =  removeZeros(line).replace(removeZeros(line).split(".", 2)[1],removeZeros(line).split(".", 2)[1][:-2] + ".0")
    print(line)

SORTIE :

192.45.0.0
192.45.0.10 
192.45.0.110 
192.45.0.1 

MODIFIER :

Si vous souhaitez remplacer la nouvelle ip list dans le même fichier, vous pouvez créer deux listes distinctes pour stocker le ips et le text:

logFile = "list.txt"
with open(logFile) as f:
    content = f.readlines()
# you may also want to remove empty lines
content = [l.strip() for l in content if l.strip()]
ipList = []
stList = []
for line in content:
    stList.append(line[1:].split(" ")[1])
    line = line[1:].split(" ")[0]
    line =  removeZeros(line).replace(removeZeros(line).split(".", 2)[1],removeZeros(line).split(".", 2)[1][:-2] + ".0")
    ipList.append(line)
    # print(line)

with open(logFile, "w") as f:
    for index in range(len(ipList)):
        f.write(str(ipList[index]) + " " + str(stList[index]) + "\n")

SORTIE (à partir du fichier) :

192.45.0.0 uue01.re1
192.45.0.10 ccu01.re1
192.45.0.110 uue02.re1
192.45.0.1 core1.re2

MODIFIER 3 :

Pour supprimer la première et la dernière ligne, utilisez le découpage:

Remplacez cette ligne:

for line in content:

Avec ça:

for line in content[1:-1]:  # after the first and before the last line
0
DirtyBit 20 mars 2019 à 08:47

Comment puis-je manipuler la 1ère chaîne / nombres [...] et en même temps rester la 2ème chaîne comme ci-dessus.

Il semble que vous puissiez diviser la chaîne sur le caractère espace avant de remplacer les points, pour modifier uniquement la partie où vous en avez besoin.

Exemple:

s = "0192.4500.0010 ccu01.re1                              "
numbers, host = s.split()
numbers = numbers.replace(".", "")
# TODO: fill in appropriate conversions with `numbers` here
print(numbers, host)

La sortie est:

019245000010 ccu01.re1

Pour référence:


Comment puis-je [...] enregistrer la ligne de sortie (file2.write (ligne)) dans une nouvelle ligne

Lors de l'écriture de la sortie dans le fichier, les caractères de nouvelle ligne ne sont pas ajoutés automatiquement. Vous devez les ajouter vous-même à la chaîne.

Exemple:

numbers = "{}.{}.{}.{}".format(*numbers)
line = "{} {}\n".format(numbers, host)
outf.write(line)

En outre, il est recommandé d'utiliser l'instruction with pour ouvrir et éventuellement fermer les fichiers.

Pour référence:

0
moooeeeep 19 mars 2019 à 09:22