Mon fichier texte est comme ci-dessous.

[0, "we break dance not hearts by Short Stack is my ringtone.... i LOVE that !!!.....\n"]
[1, "I want to write a . I think I will.\n"]
[2, "@va_stress broke my twitter..\n"]
[3, "\" "Y must people insist on talking about stupid politics on the comments of a bubblegum pop . Sorry\n"]
[4, "aww great  "Picture to burn"\n"]
[5, "@jessdelight I just played ur joint two s ago. Everyone in studio was feeling it!\n"]
[6, "http://img207.imageshack.us/my.php?image=wpcl10670s.jpg her s are so perfect.\n"]
[7, "cannot hear the new  due to geographic location. i am geographically undesirable. and tune-less\n"]
[8, "\" couples in public\n"]
[9, "damn wendy's commerical got that damn  in my head.\n"]
[10, "i swear to cheese & crackers @zyuuup is in Detroit like every 2 months & i NEVER get to see him!  i swear this blows monkeyballs!\n"]
[11, "\" getting ready for school. after i print out this\n"]

Je veux lire chaque deuxième élément de la liste signifie tous les tweets de texte dans le tableau.

J'ai écrit

tweets = []
for line in open('tweets.txt').readlines():
    print line[1]
    tweets.append(line)

Mais quand je vois la sortie, ça prend juste le 2ème caractère de chaque ligne.

2
Viral Patel 11 avril 2018 à 20:16

4 réponses

Meilleure réponse

Lorsque vous lisez un fichier texte en Python, les lignes ne sont que des chaînes. Ils ne sont pas convertis automatiquement, donc une autre structure de données.

Dans votre cas, il semble que chaque ligne de votre fichier contienne une liste JSON. Dans ce cas, vous pouvez d'abord analyser la ligne à l'aide de json.loads(). Cela convertit la chaîne en Python list dont vous pouvez ensuite prendre le deuxième élément:

import json
with open('tweets.txt') as fp:
    tweets = [json.loads(line)[1] for line in fp]
0
Erik Cederstrand 11 avril 2018 à 17:26

Plutôt que de deviner le format des données, vous devriez le découvrir .

  • Si vous le générez vous-même et que vous ne savez pas comment analyser ce que vous créez, modifiez votre code pour générer quelque chose qui peut être facilement analysé avec la même bibliothèque utilisée pour le générer, comme JsonLines ou CSV.
  • Si vous l'ingérez à partir d'une API, lisez la documentation de cette API et analysez-la de la manière dont elle est documentée.
  • Si quelqu'un vous a remis le fichier et vous a demandé de l'analyser, demandez à quelqu'un dans quel format il se trouve.

Parfois, vous devez faire face à un vieux fichier cruel dans un format qui n'a jamais été documenté et personne ne se souvient de ce que c'était. Dans ce cas, vous devez le rétroconcevoir. Mais ce que vous voulez faire, c'est deviner les possibilités, et essayez de l'analyser avec autant de validation et de gestion des erreurs que possible, pour vérifier que vous avez bien deviné.

Dans ce cas, le format ressemble beaucoup à lignes JSON ou ndjson. Les deux sont des façons légèrement différentes d'encoder plusieurs objets avec un texte JSON par ligne, avec des restrictions spécifiques sur ces textes et la façon dont ils sont encodés et les espaces entre eux.

Faites, alors qu'un analyseur rapide et sale comme celui-ci fonctionnera probablement:

with open('tweets.txt') as f:
    for line in f:
        tweet = json.loads(line)
        dosomething(tweet)

Vous souhaitez probablement utiliser une bibliothèque comme jsonlines:

with jsonlines.open('tweets.txt') as f:
    for tweet in f:
        dosomething(tweet)

Le fait que l'analyseur rapide et sale fonctionne sur les lignes JSON fait bien sûr partie de l'intérêt de ce format, mais si vous ne savez pas vraiment si vous avez des lignes JSON ou non, vous feriez mieux de vous en assurer.

1
abarnert 11 avril 2018 à 17:38

Comme votre entrée ressemble à des expressions Python, j'utiliserais {{X0} } pour les analyser.

Voici un exemple:

import ast

with open('tweets.txt') as fp:
    tweets = [ast.literal_eval(line)[1] for line in fp]

print(tweets)

Production:

['we break dance not hearts by Short Stack is my ringtone.... i LOVE that !!!.....\n', 'I want to write a . I think I will.\n', '@va_stress broke my twitter..\n', '" "Y must people insist on talking about stupid politics on the comments of a bubblegum pop . Sorry\n', 'aww great  "Picture to burn"\n', '@jessdelight I just played ur joint two s ago. Everyone in studio was feeling it!\n', 'http://img207.imageshack.us/my.php?image=wpcl10670s.jpg her s are so perfect.\n', 'cannot hear the new  due to geographic location. i am geographically undesirable. and tune-less\n', '" couples in public\n', "damn wendy's commerical got that damn  in my head.\n", 'i swear to cheese & crackers @zyuuup is in Detroit like every 2 months & i NEVER get to see him!  i swear this blows monkeyballs!\n', '" getting ready for school. after i print out this\n']
0
Robᵩ 11 avril 2018 à 17:23

Vous devriez peut-être envisager d'utiliser la méthode json.loads:

import json

tweets = []
for line in open('tweets.txt').readlines():
    print json.loads(line)[1]
    tweets.append(line)

Il y a plus de manière pythonique dans le commentaire de @Erik Cederstrand.

0
Emre Savcı 11 avril 2018 à 17:25