2017-04-17 1 views
0

Je n'ai pratiquement aucune expérience avec le fichier r/w en Python, et je voulais savoir quelle est la meilleure solution pour mon cas particulier.Ajout d'une chaîne de variables à chaque ligne dans un fichier avec Python

J'ai un onglet fichier séparé avec la structure suivante, où chaque phrase est séparée par une ligne vide:

Roundup NN 
: : 
Muslim NNP 
Brotherhood NNP 
vows VBZ 
daily JJ 
protests NNS 
in IN 
Egypt NNP 

Families NNS 
with IN 
no DT 
information NN 
on IN 
the DT 
whereabouts NN 
of IN 
loved VBN 
ones NNS 
are VBP 
grief JJ 
- : 
stricken JJ 
. . 

The DT 
provincial JJ 
departments NNS 
of IN 
supervision NN 
and CC 
environmental JJ 
protection NN 
jointly RB 
announced VBN 
on IN 
May NNP 
9 CD 
that IN 
the DT 
supervisory JJ 
department NN 
will MD 
question VB 
and CC 
criticize VB 
mayors NNS 
who WP 
fail VBP 
to TO 
curb VB 
pollution NN 
. . 

(...) 

Je veux ajouter aux lignes non vides de ce fichier, d'abord un onglet et puis une chaîne donnée.

Pour chaque ligne, la chaîne à ajouter dépendra de la valeur enregistrée dans lab_pred_tags dans le code ci-dessous. Pour chaque itération de la boucle for, lab_pred_tags a la même longueur que le nombre de lignes comme phrase correspondante dans le fichier texte. à savoir, dans l'exemple, les longueurs des lab_pred_tags pour les 3 for itérations de boucle sont 9, 15 et 12.

Pour la première itération de la boucle for, lab_pred_tags contient le list: ['O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 'B-GPE']

# (...) code to calculate lab_pred 
for lab, lab_pred, length in zip(labels, labels_pred, sequence_lengths): 
    lab = lab[:length] 
    lab_pred = lab_pred[:length] 
    # Convert lab_pred from a sequence of numbers to a sequence of strings 
    lab_pred_tags = d_u.label_idxs_to_tags(lab_pred, tags) 
    # Now what is the best solution to append each element of `lab_pred_tags` to each line in the file? 
    # Keep in mind that I will need to skip a line everytime a new for loop iteration is started 

Pour la Par exemple, le fichier de sortie souhaité est:

Roundup NN O 
: : O 
Muslim NNP B-ORG 
Brotherhood NNP I-ORG 
vows VBZ O 
daily JJ O 
protests NNS O 
in IN O 
Egypt NNP B-GPE 

Families NNS O 
with IN O 
no DT O 
information NN O 
on IN O 
the DT O 
whereabouts NN O 
of IN O 
loved VBN O 
ones NNS O 
are VBP O 
grief JJ O 
- : O 
stricken JJ O 
. . O 

The DT O 
provincial JJ O 
departments NNS O 
of IN O 
supervision NN O 
and CC O 
environmental JJ O 
protection NN O 
jointly RB O 
announced VBN O 
on IN O 
May NNP O 
9 CD O 
that IN O 
the DT O 
supervisory JJ O 
department NN O 
will MD O 
question VB O 
and CC O 
criticize VB O 
mayors NNS O 
who WP O 
fail VBP O 
to TO O 
curb VB O 
pollution NN O 
. . O 

Quelle est la meilleure solution pour cela?

+0

Pouvez-vous être plus précis sur "lab_pred_tags"? Je veux dire que vous voulez les ajouter à une ligne en fonction du numéro de ligne ou selon la deuxième chaîne dans une ligne? –

+0

Je ne veux pas faire de correspondance du tout. Juste pour ajouter les éléments "lab_pred_tags" aux lignes consécutives du fichier. Par exemple, la longueur "lab_pred_tags" dans la première itération est 9, je veux ajouter ces 9 éléments aux 9 premières lignes. Ensuite, sautez une ligne. Ensuite, dans la seconde itération, la longueur de "lab_pred_tags" est 15, et je veux ajouter les éléments aux 15 lignes après l'espace vide précédent. Etc –

Répondre

1

Pour les tests, j'ai modifié la liste lab_pred_tags. Voici ma solution:

lab_pred_tags = ['O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 
        'B-GPE', 'O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 'O', 
        'O', 'B-GPE', 'O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 
        'O', 'O', 'B-GPE', 'O'] 
    index = 0 

    with open("PATH_TO_YOUR_FILE", "r") as lab_file, \ 
      open("PATH_TO_NEW_FILE", "w") as lab_file_2: 
     lab_file_list = lab_file.readlines() 

     for lab_file_list_element in lab_file_list: 
      if lab_file_list_element != "\n": 
       new_line_element = lab_file_list_element.replace(
        "\n", ' ' + lab_pred_tags[index] + "\n" 
       ) 
       index += 1 
       lab_file_2.write(new_line_element) 
      if lab_file_list_element == "\n": 
       index = 0 
       lab_file_2.write("\n")