Mon problème de base est le suivant: j'ai un gros fichier texte et j'essaie d'accéder aux 3 premières informations de chaque ligne. Par exemple,

Line 1: blah1 blah2 blah3 blah4
Line 2: blah1 blah2 blah3 blah4
...
Line n: blah1 blah2 blah3 blah4

Cependant, après avoir divisé le texte brut en ces lignes, mes résultats sont ['blah1 blah2 blah3 blah4', 'blah1 blah2 blah3 blah4', ...'], mais ce que je veux, c'est ['blah1', 'blah2', 'blah3', 'blah4'], ['blah1', 'blah2', 'blah3', 'blah4'], et PAS juste une liste géante ['blah1', 'blah2', 'blah3', 'blah4', 'blah1', 'blah2' ...]

Mon problème est que, même si je comprends que split est pour les lignes et strip est pour les chaînes, quand j'utilise split, cela ne fait que tout écraser (par exemple, une liste géante ['blah1', 'blah2', 'blah3', 'blah4', 'blah1', 'blah2' ...] )

Voici ce que j'ai

f = open('file.txt')

raw = f.read()
raw = raw.lower() 

l = raw.splitlines() 
l = [re.sub(r'\t', ' ', l) for l in l] #replace tabs

l1 =[]
for elem in l:
    l1.extend(elem.strip().split(' '))
print l1

f.close()

J'ai regardé de nombreuses questions / réponses d'autres personnes sur split et strip, et je pense que mon problème est peut-être dû au fait que mon code initial divise le texte par ligne, me donnant ainsi des listes travailler avec, alors qu'en réalité, chacune de mes lignes est toujours une chaîne que je dois séparer et PAS une liste, mais à cause de la syntaxe python, je dois travailler avec la chaîne comme s'il s'agissait d'une liste. S'il vous plaît, tout conseil que vous pouvez me donner qui m'aiderait à comprendre quel est mon problème et comment le résoudre serait très apprécié.

2
SnarkShark 20 juil. 2015 à 12:49

2 réponses

Meilleure réponse

Vous devez utiliser append au lieu de extend:

for elem in l:
    l1.append(elem.strip().split(' '))

append traite l'argument comme un élément unique. extend traite l'argument comme un autre objet de type liste (ou plus précisément, un itérable), le parcourt et ajoute les éléments un par un à la liste d'origine.

3
YS-L 20 juil. 2015 à 09:58

En plus d'utiliser extend lorsque vous devriez utiliser append, tout votre code peut devenir deux lignes car vous faites beaucoup trop de travail inutile:

with open('file.txt') as f:
   lines = [line.lower().rstrip().split() for line in f]

str.split gérera très bien les onglets donc les remplacer par des espaces n'est pas nécessaire et utiliser une expression régulière pour les remplacer serait excessif dans tous les cas.

Vous n'avez pas besoin de lire tout le contenu du fichier en mémoire, vous pouvez simplement créer votre liste de listes dans une liste compilant sur l'objet fichier appelant lower et divisée sur chaque ligne.

1
Padraic Cunningham 20 juil. 2015 à 10:44