En utilisant Python, je dois écrire un script qui "nettoie" essentiellement un fichier texte de données. Jusqu'à présent, j'ai supprimé tous les caractères indésirables ou les ai remplacés par des caractères acceptables (par exemple, un tiret - peut être remplacé par un espace). Maintenant, je suis arrivé au point où je dois séparer les mots qui sont réunis. Voici un extrait des 15 premières lignes du fichier texte

AccessibleComputing  Computer accessibility
AfghanistanHistory  History of Afghanistan
AfghanistanGeography  Geography of Afghanistan
AfghanistanPeople  Demographics of Afghanistan
AfghanistanCommunications  Communications in Afghanistan
AfghanistanMilitary  Afghan Armed Forces
AfghanistanTransportations  Transport in Afghanistan
AfghanistanTransnationalIssues  Foreign relations of Afghanistan
AssistiveTechnology  Assistive technology
AmoeboidTaxa  Amoeba
AsWeMayThink  As We May Think
AlbaniaHistory  History of Albania
AlbaniaPeople  Demographics of Albania
AlbaniaEconomy  Economy of Albania
AlbaniaGovernment  Politics of Albania

Ce que je veux faire, c'est séparer les mots qui sont joints au point où la lettre majuscule apparaît. Par exemple, je veux que la première ligne ressemble à ceci:

Accessible Computing  Computer accessibility

Le script doit prendre l'entrée du fichier et écrire le résultat dans un fichier de sortie. C'est ce que j'ai actuellement et ça ne marche pas du tout! (je ne sais pas si je suis sur la bonne voie ou pas non plus)

import re

input_file = open("C:\\Users\\Lucas\\Documents\\Python\\pagelinkSample_10K_cleaned2.txt",'r')
output_file = open("C:\\Users\\Lucas\\Documents\\Python\\pagelinkSample_10K_cleaned3.txt",'w')

for line in input_file:
    if line.contains('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'):
        newline = line.

output_file.write(newline)

input_file.close()
output_file.close()
1
lsch91 6 mars 2016 à 01:35

3 réponses

Meilleure réponse

Je suggère de diviser les mots avec l'expression régulière suivante:

import re, os

input_file = 'input.txt'
output_file = 'output.txt'

with open(input_file, 'r') as f_in:
    with open(output_file, 'w') as f_out:
        for line in f_in.readlines():
            p = re.compile(r'[A-Z][a-z]+|\S+')

            matches = re.findall(p, line)
            matches = ' '.join(matches)

            f_out.write(matches+ os.linesep)

En supposant que data.txt contient du texte que vous avez collé dans votre message, il imprimera:

Accessible Computing Computer accessibility
Afghanistan History History of Afghanistan
Afghanistan Geography Geography of Afghanistan
Afghanistan People Demographics of Afghanistan
Afghanistan Communications Communications in Afghanistan
Afghanistan Military Afghan Armed Forces
Afghanistan Transportations Transport in Afghanistan
Afghanistan Transnational Issues Foreign relations of Afghanistan
Assistive Technology Assistive technology
Amoeboid Taxa Amoeba
As We May Think As We May Think
Albania History History of Albania
Albania People Demographics of Albania
Albania Economy Economy of Albania
Albania Government Politics of Albania
...
1
Alan Moore 6 mars 2016 à 07:34

Vous pourriez faire:

re.sub(r'(?P<end>[a-z])(?P<start>[A-Z])', '\g<end> \g<start>', line)

Cela insérera un espace entre les lettres majuscules minuscules côte à côte (en supposant que vous n'avez que des caractères anglais.)

0
sammygadd 5 mars 2016 à 22:59

Ce n'est pas la meilleure méthode, mais c'est simple.

from string import uppercase

s = 'AccessibleComputing Computer accessibility'

>>> ' '.join(''.join(' ' + c if n and c in uppercase else c 
                     for n, c in enumerate(word)) 
             for word in s.split())
'Accessible Computing Computer accessibility'

Et en passant, voici comment vous devez lire / écrire votre fichier:

f_in = "C:\\Users\\Lucas\\Documents\\Python\\pagelinkSample_10K_cleaned2.txt"
f_out = "C:\\Users\\Lucas\\Documents\\Python\\pagelinkSample_10K_cleaned3.txt"

def func(line):
    processed_line = ... # your line processing function
    return processed_line

with open(f_in, 'r') as fin:
    with open(f_out, 'w') a fout:  
        for line in fin.readlines():
            fout.write(func(line))
1
Alexander 5 mars 2016 à 23:11