2009-04-21 6 views
0

Est-ce que Python a un équivalent de $ OUTPUT_RECORD_SEPARATOR ou de $ \ in Perl?

MISE À JOUR: Je suis totalement eu ce mal ... je cherchais un équivalent Python à un INPUT_RECORD_SEPARATOR de $ s'il y a une telle chose? Quelque chose que vous pouvez remplacer de sorte que lorsque vous faites un appel de type readline(), il cherche quelque chose d'autre que le caractère de nouvelle ligne. Désolé de botching la question originale.

+1

Note aux répondeurs: OUTPUT_RECORD_SEPARATOR est ce qui est sorti après une impression; OUTPUT_FIELD_SEPARATOR est ce qui est sortie entre les arguments à imprimer. – Miles

Répondre

1

Vous pouvez utiliser la méthode '' .join. par exemple.

# print 'foo', 'bar', 'baz' separated by spaces 
print 'foo', 'bar', 'baz' 
# print separated by commas 
print ', '.join(['foo', 'bar', 'baz']) 

EDIT:

Ok, j'ai mal compris le but de OUTPUT_RECORD_SEPARATOR, donc '' .join est pas ce que vous voulez.

print 'foo' est équivalent à sys.stdout.write('foo'+'\n'), vous pouvez donc rouler votre propre fonction d'impression:

def myprint(*args, end='\n'): 
    sys.stdout.write(' '.join(args) + end) 

Ou aller un peu plus loin avec une fonction d'usine:

def make_printer(end): 
    def myprint(*args, end='\n'): 
     sys.stdout.write(' '.join(args) + end) 
    return myprint 

# usage: 
p = make_printer('#') 
p('foo', 'bar', 'baz') 

Enfin, si vous êtes audacieux , vous pouvez remplacer sys.stdout:

sys.old_stdout = sys.stdout 
class MyWrite(object): 
    def __init__(self, end='\n'): 
     self.end = end 
    def write(self, s): 
     sys.old_stdout.write(s.replace('\n', self.end)) 

Cela provoquera print instructions pour produire la fin de ligne alternative. Utilisation:

sys.stdout = MyWrite('!\n') 
print 'foo' 
# prints: foo! 

Notez que vous devrez peut-être remplacer plus il suffit d'écrire() - ou tout au moins fournir réoriente pour des choses comme MyWrite.flush() à sys.old_stdout.flush().

1

La fonction d'impression de Python 3 comporte les arguments sep et end.

print('foo', 'bar', 'baz', sep='|', end='#') 

Notez que dans Python 3, print est plus une déclaration, il est une fonction.

+1

Ou dans le cas de OUTPUT_RECORD_SEPARATOR, imprimer ('foo', 'bar', 'baz', end = '|') – Miles

+0

Merci, j'ai édité la réponse. Jamais codé en Perl, j'ai juste deviné ce qu'est OUTPUT_RECORD_SEPARATOR. – codeape

0

En pré-3 Python, vous pouvez supprimer le séparateur norme appending '' à la fin de la ligne:

print yourVar, #these 3 lines print without any newline separator 
print yourVar, 
print yourVar, 

si vous souhaitez utiliser le séparateur non standard, supprimer normal et imprimer le vôtre:

print yourVar, yourSep, 
print yourVar, yourSep, 
print yourVar, yourSep, 
1

Si ce que vous voulez est d'avoir l'une des \r, \n ou \r\n dans l'entrée être considérée comme une nouvelle ligne, vous pouvez utiliser « support universel newline » dans votre appel « open() ».

En Python 2.6 open(), cela doit être activé explicitement en ajoutant « U » à la chaîne de mode:

in_file = open('foo.txt', 'rU') 

Cela dépend aussi de ce support étant disponible dans l'interpréteur Python; mais les docs disent que c'est disponible par défaut.

Dans Python 3.0 open(), le comportement de retour à la ligne universel est toujours disponible et est le comportement par défaut; vous pouvez choisir un comportement différent avec des valeurs différentes pour le paramètre newline. Si vous voulez que les entrées interprètent des enregistrements terminés par autre chose qu'une nouvelle ligne, vous ne voulez pas de 'readlines' (qui, par nom, lit les lignes spécifiquement, pas les enregistrements généralement) et AFAIK devra mettre en œuvre votre propre code de lecture d'enregistrements.

+0

Que faire si je veux que \ x00 soit vu comme la fin de la ligne? – BuddyJoe

+0

Ou y a-t-il une autre méthode élégante de boire dans un peu du fichier à un moment délimité par autre chose qu'une nouvelle ligne? – BuddyJoe

+0

+1 pour la chose Universal Newline. Je ne savais pas à ce sujet. THX. – BuddyJoe

0
open('file').read().split(your_separator_of_choice) 

la seule différence avec readlines() ici est que les éléments de la liste résultant ne sont conservés séparateur à la fin.