2017-08-31 1 views
0

Salutations, J'essaie d'écrire une fonction qui imprime les données d'un fichier texte ligne par ligne. La sortie doit avoir le numéro de la ligne suivi d'un deux-points et d'un espace. Je suis venu avec le code suivant;Lignes d'impression Python à partir d'un fichier

def print_numbered_lines(filename): 
    """Function to print numbered lines from a list""" 
    data = open(filename) 
    line_number = 1 
    for line in data: 
     print(str(line_number)+": "+line, end=' ') 
     line_number += 1 

La question est quand je lance cette fonction à l'aide des fichiers texte de test j'ai créé, la première ligne ne sont pas sur le même niveau de retrait que le reste des lignes dans la sortie, par exemple. les sorties ressemblent un peu à 1: 9874234,12.5,23.0,50.0 2: 7840231,70,60,85.4 3: 3845913,55.5,60.5,80.0 4: 3849511,20,60,50 Où est-ce que je vais mal? Merci

+0

Accepter une réponse si elle résout le problème. –

Répondre

0

Vous avez spécifié end comme espace. Donc, après la première ligne, chacun a cet espace supplémentaire.

ligne

que votre lecture de fichier ressemble somehting comme ceci:

'9874234,12.5,23.0,50.0\n' 

Regardez la fin. La traduction de ligne est due à la ligne d'origine.

Donc, pour obtenir ce que vous voulez, vous avez juste besoin de changer l'argument end d'impression à une chaîne vide (pas d'espace)

De plus, je vous conseille de changer la mise en œuvre de la fonction et l'utilisation enumerate pour la numérotation des lignes.

def print_numbered_lines(filename): 
    data = open(filename) 
    for i, line in enumerate(data): 
     print(str(i+1)+": "+line, end='') 
2

Remplacer la valeur de l'argument end avec une chaîne vide au lieu de l'espace. Comme l'argument end est un espace, il imprime un espace après chaque ligne. Donc, ces dernières lignes ont un espace au début de la ligne.

def print_numbered_lines(filename): 
    """Function to print numbered lines from a list""" 
    data = open(filename) 
    line_number = 1 
    for line in data: 
     print(str(line_number) + ": " + line, end='') 
     line_number += 1 

Une autre façon vous pouvez faire cela, est strip les nouvelles lignes et d'imprimer sans passer aucune valeur à l'argument end. Cela supprimera le \n qu'il a à la fin de la ligne et une nouvelle ligne sera imprimée comme end="\n" par défaut.

def print_numbered_lines(filename): 
    """Function to print numbered lines from a list""" 
    data = open(filename) 
    line_number = 1 
    for line in data: 
     print(str(line_number) + ": " + line.strip("\n")) 
     line_number += 1 
0

Cela concerne la commande d'impression.

print(str(line_number)+": "+line, end=' ')

Vous avez sans doute vu que lors de l'impression des lignes il y avait une ligne supplémentaire entre eux et vous avez essayé de contourner ce problème en utilisant end=' '.

Si vous souhaitez supprimer les lignes 'vides', vous devez utiliser line.strip(). Cela les supprime.

Utilisez ceci:

print(str(line_number)+": "+line.strip())

bande

peut également prendre un argument. Ceci provient de la documentation:

str.bande ( [chars] )

retour une copie de la chaîne avec le d'attaque et de fuite des caractères retirés. L'argument chars est une chaîne spécifiant l'ensemble des caractères à supprimer. Si elle est omise ou None, l'argument chars par défaut supprime les espaces. L'argument chars n'est pas un préfixe ou un suffixe; plutôt, toutes les combinaisons de ses valeurs sont dépouillées:

Qu'est-ce que c'est?

Les lignes de votre fichier ne sont pas séparées par des lignes différentes. Sur Linux, une nouvelle ligne est représentée par \n. Les éditeurs normaux les convertissent en poussant le texte vers le bas dans une nouvelle ligne.

Lors de la lecture d'un fichier Python sépare les lignes exactement sur ces \n mais ne les jette pas. Lors de l'impression, ils seront interprétés à nouveau et combinés avec la nouvelle ligne print ajoute qu'il y aura une nouvelle ligne «trop».

Le paramètre end dans votre instruction d'impression change simplement ce que print utilisera après l'impression d'une ligne. La valeur par défaut est \n.

Vérifiez ce qu'il fait lorsque vous utilisez end=" !":

1: aaa 
!2: bbb 
!3: ccc 

Vous pouvez voir le \n après « aaa » provoque un saut de ligne (qui fait partie de la chaîne) et après impression ajoute le contenu de end. Donc, il ajoute un !. La ligne suivante est imprimée dans la même ligne car il n'y a pas d'autre saut de ligne qui provoquerait un saut de ligne avant de l'imprimer.