Lire Jusqu'à ce qu'un Point de Python
J'ai un fichier texte plein de données qui commence avec
#Name
#main
puis il est suivi par beaucoup de chiffres et ensuite le fichier se termine avec
#extra
!side
Voici donc un petit extrait de
#Name
#main
60258960
33031674
72302403
#extra
!side
Je veux lire seulement les chiffres. Mais ici, c'est le coup de pied, je veux qu'ils aient chacun leur propre chaîne.
Donc je sais comment lire de départ après les en-têtes avec
read=f.readlines()[3:]
Mais je suis perplexe sur tout le reste. Des suggestions?
OriginalL'auteur user1985351 | 2013-04-11
Vous devez vous connecter pour publier un commentaire.
Vous êtes assez proche, que vous êtes. Vous avez juste besoin de modifier votre liste tranche de couper les deux dernières lignes dans le fichier avec les deux premiers.
readlines
va naturellement revenir une liste où chaque élément est une ligne du fichier. Cependant, il aura aussi le "saut de ligne" à la fin de chaque chaîne, de sorte que vous pouvez avoir besoin de filtre.read = myfile.read().splitlines()[2:-2]
.Notez que
.strip()
également de supprimer toutes les avant/après de l'espace ou tabulation. Vous pouvez utilisernumber.rstrip("\n")
pour l'éviter. (c'est pas pertinente pour les OP de la question, mais peut être utile pour tous ceux qui lisent)OriginalL'auteur Michael0x2a
Lire ligne par ligne. Utiliser #main comme un drapeau pour commencer le traitement. Utilisez #extra comme un drapeau pour arrêter le traitement.
exemple de sortie
python read_up_to_a_point.py
['60258960', '33031674', '72302403']
OriginalL'auteur Keith John Hutchison
Je voudrais faire quelque chose comme ceci:
nums
ne contient que les lignes avec des numéros. Si vos numéros sont bien formés, ce qui signifie pas négative et aucune hexadécimal. Qui va prendre une expression régulière correspondant précisément.OriginalL'auteur squiguy
Vous ne devez utiliser
.readlines()
si vous savez que vos fichiers d'entrée s'adapte confortablement dans la mémoire; il lit toutes les lignes à la fois.La plupart du temps, vous pouvez lire une ligne de saisie à un moment, et que vous pouvez simplement effectuer une itération de la poignée de fichier de l'objet.
Quand vous voulez spécial, difficile de gérer les entrées, je vous recommande de l'encapsulation de la manipulation dans un générateur de fonction comme ceci:
Noter que cette fonction d'entrée soigneusement valide l'entrée, le déclenchement d'une exception, quand quelque chose est incorrect dans l'entrée. Mais la boucle à l'aide de la saisie des données est simple et propre; le code à l'aide
read_points_data()
peut être épuré.J'ai fait
read_points_data()
convertir les points en entrée deint
valeurs. Si vous voulez vraiment les points comme des chaînes de caractères, vous pouvez modifier le code; j'ai laissé un commentaire là pour vous le rappeler.Je pense que c'est une bonne réponse. Peut-être que la personne pourrait s'en tirer avec ne vérifiant pas les entrées, mais je pense qu'il n'est jamais mauvais pour valider la saisie de données, et cette réponse montre comment masquer tous la validation de sa propre fonction. Remarquez comment le
for
boucle qui utilise les données est propre et épurée en dépit de la très approfondie de vérification d'erreur... les générateurs sont une des choses que j'aime à propos de Python.Votre idée de l'encapsulation de la lecture du fichier d'entrée dans un générateur de fonction peut avoir de valeur que si elle répond à l'OP du problème. Cependant, à mon humble avis, votre exemple de code serait mieux si elle vient de l'illustrer le concept de base. Je ne dis pas de validation de la saisie et la gestion des erreurs ne sont pas importants, mais cette question n'est pas à leur sujet. Vous pourriez juste montrer en votre technique se prête à les faire et à gauche dans sa toute sa splendeur. Il est difficile de voir la forêt pour les arbres de votre réponse code.
Je ne comprends pas pourquoi vous dites "si il aborde le cas des OP problème" lorsque le code exactement résout les OP du problème. Je suis en désaccord que le fait de fournir testé, le code du travail rend ma réponse pour le pire. Je suis également en désaccord qu'il est difficile de généraliser à partir du code de travail pour résoudre les autres problèmes. Je suppose que nous allons être en désaccord sur ce point. Si vous avez tout intérêt à en discuter plus, nous ferions mieux de le prendre pour le chat, comme StackOverflow fronce les sourcils sur de longues discussions dans les commentaires d'une réponse.
Non merci même si vous n'êtes apparemment pas l'obtention de mon point de vue...mais c'est OK, <soupir>.
OriginalL'auteur steveha
Il n'est pas toujours une bonne idée (ou peut-être même une mesure du possible) d'utiliser
readlines()
sans argument, car il va lire dans le fichier tout entier et, potentiellement, de consommer beaucoup de mémoire, et faire de qui peut ne pas être nécessaire si vous n'avez pas besoin de tout cela à la fois, selon exactement ce que vous faites.Donc, d'une façon de faire ce que vous voulez est d'utiliser un Python générateur de fonction pour extraire juste les lignes ou les valeurs dont vous avez besoin à partir d'un fichier. Elles sont très faciles à créer, essentiellement, vous utilisez simplement
yield
déclarations de valeurs de retour au lieu dereturn
. À partir d'une programmation de point de vue, la principale différence entre eux est que l'exécution se poursuivra avec la ligne suivante de layield
déclaration prochaine fois que la fonction est appelée, plutôt que d'une première ligne comme ce serait normalement le cas. Cela signifie que leur état interne est automatiquement enregistré entre les appels suivants, qui fait de faire compliqué de traitement à l'intérieur facilement.Voici une assez minime exemple de l'utilisation de l'un pour obtenir les données que vous voulez de fichier, de manière progressive, d'une ligne-à-un-temps de sorte qu'il ne nécessite pas d'assez de mémoire pour contenir la totalité du fichier:
Bien sûr, vous pouvez toujours les rassembler tous ensemble dans une liste, si vous le souhaitez, comme ceci:
Comme vous pouvez le voir, il est possible de faire d'autres choses utiles à la fonction, comme la validation du format des fichiers de données ou de prétraitement dans d'autres façons. Dans l'exemple ci-dessus j'ai fait un peu de que en supprimant les caractères de saut de ligne
readlines()
feuilles sur chaque ligne de la liste qu'il renvoie. Il serait trivial aussi de convertir chaque valeur de la chaîne en un entier en utilisantyield int(value)
au lieu de simplementyield value
.J'espère que cela va vous donner une idée de ce qui est possible et de trouver des compromis au moment de décider de la méthode à utiliser pour effectuer la tâche à portée de main.
'\n'
pour représenter la fin de la ligne. Vous pouvez utiliser universelle "saut de ligne" mode: docs.python.org/2/library/functions.html?highlight=open#open Et depuisfile
est un construit-dans le mot en général je n'ai pas utiliserfile
comme identificateur. Mais ceux qui sont lentes; j'aime la réponse.Merci, il est, après tout, juste votre propre idée a présenté un peu différemment. Vous avez raison, seulement
'\n'
est nécessaire, mais l'ouverture du fichier dans'rU'
mode n'est pas à cause de l'ouverture du fichier en "mode texte" -- qui'r'
et'rt'
les deux, n'est -- implique que la plate-forme dépendant du caractère de nouvelle ligne de manutention sera activé. Cela signifie qu'ils seront convertis au caractère unique'\n'
forme que ce soit ou pas universelle de retour à la ligne est activée dans l'interpréteur Python utilisés, seulement qu'il sera géré par le système d'exploitation (qui peut être plus rapide).OriginalL'auteur martineau