web-dev-qa-db-fra.com

Nouvelle ligne dans la fonction python print ())

J'utilise Python 2.7.3 et j'écris un script qui affiche les octets hexadécimaux de tout fichier défini par l'utilisateur. Il fonctionne correctement avec un problème: chacune des valeurs est en cours d'impression. Est-il possible d’imprimer les valeurs avec des espaces au lieu de nouvelles lignes?

Par exemple, au lieu de

61

62

Je voudrais avoir 61 62.

Ci-dessous mon code (..txt est un fichier qui contient le texte 'abcd'):

#!usr/bin/python
import os
import sys
import time

filename = raw_input("Enter directory of the file you want to convert: ")

f = open(filename, 'rb')
fldt = f.read()
lnfl = len(fldt)
print "Length of file is", lnfl, "bytes. "
orck = 0
while orck < lnfl:
    bndt = hex(ord(fldt[orck]))
    bndt = bndt[-2:]
    orck = orck + 1
    ent = chr(13) + chr(10)
    entx = str(ent)
    bndtx = str(bndt)
    bndtx.replace(entx, ' ')
    print bndtx
25
Anonymous Noone

Tout d’abord, print n’est pas une fonction dans Python 2, c’est une déclaration.

Pour supprimer la nouvelle ligne automatique, ajoutez un dernier , (Virgule). Maintenant, un espace sera utilisé à la place d'une nouvelle ligne.

Démo:

print 1,
print 2

sortie:

1 2

Ou utilisez Python 3 print() fonction) :

from __future__ import print_function
print(1, end=' ') # default value of `end` is '\n'
print(2)

Comme vous pouvez le voir clairement, la fonction print() est beaucoup plus puissante, car nous pouvons spécifier n'importe quelle chaîne à utiliser comme end plutôt qu'un espace fixe.

39
Ashwini Chaudhary

Cela fait presque tout ce que vous voulez:

f = open('data.txt', 'rb')

while True:
    char = f.read(1)
    if not char: break
    print "{:02x}".format(ord(char)),

Avec data.txt créé comme ceci:

f = open('data.txt', 'wb')
f.write("ab\r\ncd")
f.close()

Je reçois la sortie suivante:

61 62 0d 0a 63 64

tl; dr - 1. Vous utilisez des noms de variables médiocres. 2. Vous coupez vos chaînes hexagonales de manière incorrecte. 3. Votre code ne remplacera jamais de nouvelles lignes. Vous voudrez peut-être simplement oublier cette fonctionnalité. Vous ne comprenez pas encore la différence entre un caractère, son code entier et la chaîne hexagonale qui représente l'entier. Elles sont toutes différentes: deux sont des chaînes et l’autre est un entier, et aucune d’entre elles n’est égale. 4. Pour certains fichiers, vous ne devez pas supprimer les nouvelles lignes.

===

1. Vos noms de variable sont horribles.

C'est bien si vous ne voulez jamais poser de questions à qui que ce soit. Mais comme chacun doit poser des questions, vous devez utiliser des noms de variable descriptifs que tout le monde peut comprendre. Vos noms de variables ne sont que légèrement meilleurs que ceux-ci:

fname = 'data.txt'
f = open(fname, 'rb')
xxxyxx = f.read()

xxyxxx = len(xxxyxx)
print "Length of file is", xxyxxx, "bytes. "
yxxxxx = 0

while yxxxxx < xxyxxx:
    xyxxxx = hex(ord(xxxyxx[yxxxxx]))
    xyxxxx = xyxxxx[-2:]
    yxxxxx = yxxxxx + 1
    xxxxxy = chr(13) + chr(10)
    xxxxyx = str(xxxxxy)
    xyxxxxx = str(xyxxxx)
    xyxxxxx.replace(xxxxyx, ' ')
    print xyxxxxx

Ce programme fonctionne bien, mais il est impossible de comprendre.

2. La fonction hex () produit des chaînes de différentes longueurs.

Par exemple,

print hex(61)
print hex(15)

--output:--
0x3d
0xf

Et prendre la tranche [-2:] pour chacune de ces chaînes vous donne:

3d
xf

Voyez comment vous avez obtenu le 'x' dans le second? La tranche:

[-2:] 

dit d'aller au bout de la chaîne et de sauvegarder deux caractères, puis de récupérer le reste de la chaîne. Au lieu de cela, prenez la tranche commençant par 3 caractères à partir du début:

[2:]  

. Votre code ne remplacera jamais les nouvelles lignes.

Supposons que votre fichier comporte ces deux caractères consécutifs:

"\r\n"

Maintenant, vous lisez le premier caractère, "\ r", et vous le convertissez en un entier, ord ("\ r"), ce qui vous donne l'entier 13. Maintenant, vous le convertissez en une chaîne, hex (13), qui vous donne la chaîne "0xd", et vous coupez les deux premiers caractères en vous donnant:

"d"

Ensuite, cette ligne dans votre code:

bndtx.replace(entx, ' ')

essaie de trouver chaque occurrence de la chaîne "\r\n" dans la chaîne "d" et le remplacer. Il n'y aura jamais de remplacement car la chaîne de remplacement est longue de deux caractères et la chaîne "d" est un caractère long.

Le remplacement ne fonctionnera pas pour "\r\n" et "0d" Soit. Mais au moins, il est possible que cela fonctionne, car les deux chaînes ont deux caractères. Réduisons les deux chaînes en un dénominateur commun: les codes ascii. Le code ascii pour "\ r" est 13 et le code ascii pour "\ n" est 10. Maintenant, qu'en est-il de la chaîne "0d"? Le code ascii pour le caractère"0" est égal à 48 et le code ASCII du caractère "d" est égal à 100. Ces chaînes n'ont pas un seul caractère en commun. Même cela ne fonctionne pas:

 x = '0d' + '0a'
 x.replace("\r\n", " ")
 print x

 --output:--
 '0d0a'

Cela ne va pas non plus:

x = 'd' + 'a'
x.replace("\r\n", " ")
print x

--output:--
da

La ligne du bas est: convertir un caractère en un entier puis en une chaîne hexagonale ne vous donne pas le caractère original - ce ne sont que des chaînes différentes. Donc, si vous faites ceci:

char = "a"
code = ord(char)
hex_str = hex(code)

print char.replace(hex_str, " ")

... vous ne pouvez pas vous attendre à ce que "a" soit remplacé par un espace. Si vous examinez le résultat ici:

char = "a"
print repr(char)

code = ord(char)
print repr(code)

hex_str = hex(code)
print repr(hex_str)

print repr(
    char.replace(hex_str, " ")
)

--output:--
'a'
97
'0x61'
'a'

Vous pouvez voir que 'a' est une chaîne contenant un caractère et '0x61' est une chaîne de 4 caractères: '0', 'x', '6', et '1', et vous ne pouvez jamais trouver une chaîne de quatre caractères dans une chaîne de un caractère.

4) La suppression des nouvelles lignes peut corrompre les données.

Pour certains fichiers, vous ne souhaitez pas remplacer les nouvelles lignes. Par exemple, si vous lisiez dans un fichier .jpg, qui contient un ensemble d’entiers représentant les couleurs d’une image, et que certaines couleurs de l’image étaient représentées par le nombre 13 suivi du nombre 10, votre le code éliminerait ces couleurs de la sortie.

Cependant, si vous écrivez un programme pour lire uniquement les fichiers text, le remplacement des nouvelles lignes est acceptable. Mais ensuite, différents systèmes d'exploitation utilisent différentes lignes nouvelles. Vous essayez de remplacer les nouvelles lignes de Windows (\ r\n), ce qui signifie que votre programme ne fonctionnera pas avec les fichiers créés par un ordinateur Mac ou Linux, qui utilisent\n pour les nouvelles lignes. Il existe des moyens simples de résoudre ce problème, mais vous ne voulez peut-être pas vous inquiéter pour l'instant.

J'espère que tout ça n'est pas trop déroutant.

22
7stud