J'ai deux fichiers qui se ressemblent exactement: file1

1 in seattle today the secretary of education richard riley delivered his address 
1 one of the things he focused on as the president had done
1 abc's michele norris has been investigating this
2 we're going to take a closer look tonight at the difficulty of getting meaningful

File2

1 in seattl today the secretari of educ richard riley deliv hi address
1 one of the thing he focus on a the presid had done
1 abc michel norri ha been investig thi 
2 we'r go to take a closer look tonight at the difficulti of get meaning

Lorsque j'exécute ce code:

result=defaultdict(list)
with open("onthis.txt","r") as filer:
    for line in filer:
        label, sentence= line.strip().split(' ', 1)
        result[label].append(sentence)

Cela fonctionne parfaitement pour file1 mais me donne une erreur de valeur pour file2:

label, sentence= line.strip().split(' ', 1)
ValueError: need more than 1 value to unpack

Je ne semble pas saisir la raison quand ils sont tous les deux dans le même format. Donc, je viens de supprimer les lignes vides par cette commande de terminal:

sed '/^$/d' onthis.txt > trial

Mais la même erreur apparaît.

0
minks 8 mars 2016 à 16:48

3 réponses

Meilleure réponse

Ils ne peuvent pas être exactement les mêmes. Je suppose qu'il y a une ligne vide / espace blanc quelque part dans votre deuxième fichier, probablement à la fin.

L'erreur vous indique que lors de l'exécution du fractionnement, il n'y a pas d'espaces sur lesquels diviser, donc une seule valeur est renvoyée, plutôt qu'une valeur pour label et sentence.

1
Gareth Webber 8 mars 2016 à 13:53

Sur la base de votre modification, je pense que vous pourriez avoir encore des lignes "vides" dans votre fichier texte. Eh bien, je devrais probablement mieux dire: des lignes remplies de rien d'autre que des espaces blancs.

J'ai étendu votre exemple de fichier:

1 in seattl today the secretari of educ richard riley deliv hi address
1 one of the thing he focus on a the presid had done
1 abc michel norri ha been investig thi 
2 we'r go to take a closer look tonight at the difficulti of get meaning
 3   foo

4 bar


5 qun

Ce n'est probablement pas clair, mais la ligne entre 3 foo et 4 bar est remplie par quelques espaces blancs tandis que les lignes entre 4 bar 5 qun ne sont "que" de nouvelles lignes ({{ X4}}).

Remarquez la sortie de sed '/^$/d'

1 in seattl today the secretari of educ richard riley deliv hi address
1 one of the thing he focus on a the presid had done
1 abc michel norri ha been investig thi 
2 we'r go to take a closer look tonight at the difficulti of get meaning
 3   foo

4 bar
5 qun

Les lignes vides sont vraiment supprimées - sans aucun doute. Mais les lignes d'espaces blancs pseudo-vides sont toujours là. L'exécution de votre script python générera une erreur en atteignant cette ligne:

2 we'r go to take a closer look tonight at the difficulti of get meaning

 3   foo    

Traceback (most recent call last):
  File "python.py", line 9, in <module>
    label, sentence= line.strip().split(' ', 1)
ValueError: need more than 1 value to unpack

Donc, ma suggestion serait d'étendre votre script d'une ligne, en faisant sauter des lignes vides dans votre fichier d'entrée.

for line in filer:
    if not line.strip(): continue

Cela a pour effet secondaire positif de ne pas avoir à préparer vos fichiers d'entrée avec un peu de sed - magie auparavant.

1
nuala 8 mars 2016 à 14:51

Sur la base de ce qui précède que vous avez fourni (avec un ajustement). Cela semble donner le résultat escompté.

result = {}

with open("test.txt", "r") as filer:
    for line in filer:
        label, sentence = line.strip().split(' ', 1)
        try:
            result[label].append(sentence)
        except KeyError:
            result[label] = [sentence]

Production:

{'2': ["we'r go to take a closer look tonight at the difficulti of get meaning"], '1': ['in seattl today the secretari of educ richard riley deliv hi address', 'one of the thing he focus on a the presid had done', 'abc michel norri ha been investig thi']}

Cela doit donc signifier qu'il nous manque quelque chose dans ce que vous avez fourni. Je pense que si ce qui précède ne vous donne pas ce dont vous avez besoin, alors plus d'informations sont nécessaires

-1
John Dowling 8 mars 2016 à 14:24