2017-08-28 2 views
0

J'ai un fichier input.txt avec le contenu suivant. Je veux utiliser ceci comme une entrée standard en utilisant la commande suivante dans la ligne de commande.python stdin avec le fichier txt et la fonction input()

python a.py < input.txt 

Dans le script a.py, je suis en train de lire la ligne d'entrée en ligne à l'aide input() fonction. Je sais qu'il existe de meilleures façons de lire le stdin, mais j'ai besoin d'utiliser la fonction input().

Une approche naïve de

line1 = input() 
line2 = input() 

ne fonctionne pas. Je reçois le message d'erreur suivant.

File "<string>", line 1 
    4 5 
    ^
SyntaxError: unexpected EOF while parsing 

Répondre

1

De cette façon est ok, cela fonctionne:

read = input() 
print(read) 

mais vous en train de lire une seule ligne.

De l'input() doc:

La fonction lit alors une ligne d'entrée, il se transforme en une chaîne (stripping un retour à la ligne de fuite) et le renvoie.

Cela signifie que si le fichier ne se termine pas avec une ligne blanche, ou quelle est la même, la dernière ligne non vide du fichier ne se termine pas avec un caractère end of line, vous obtiendrez exceptions.SyntaxError et la dernière ligne ne pas être lu.

+0

j'ai ajouté plus de détails. J'ai une erreur quand j'essaie de lire la deuxième ligne. – zcadqe

+0

@hwchung J'ai édité ma réponse. Une raison particulière pour laquelle vous devez vous en tenir à la fonction 'input()'? Comme je vois la situation, ou vous ajoutez une ligne de fin à la fin de votre fichier, ou vous devrez utiliser un autre moyen en plus de 'input()' pour lire le contenu du fichier que vous avez passé comme entrée standard du script . Existe plusieurs autres options, laissez-moi savoir si vous êtes intéressé par eux;) –

+0

Merci pour la réponse. Je veux coller avec la fonction input() parce que ce que j'essaye de faire est de déboguer mon code utilisé dans le site Web de HackerRank. Là, j'utilise la fonction input() pour prendre l'entrée. Il est beaucoup plus facile de déboguer en utilisant ma machine locale. Donc j'essaye d'écrire un code pour prendre l'entrée localement. Que voulez-vous dire en ajoutant la ligne de fin à la fin de mon fichier? – zcadqe

0

Vous mentionnez HackerRank; en regardant certaines de mes anciennes soumissions, je pense que j'ai choisi d'abandonner input au lieu de sys.stdin manipulations. input() est très similaire à next(sys.stdin), mais ce dernier va gérer EOF très bien.

A titre d'exemple, ma réponse pour https://www.hackerrank.com/challenges/maximize-it/

import sys 
import itertools 

# next(sys.stdin) is functionally identical to input() here 
nK, M = (int(n) for n in next(sys.stdin).split()) 

# but I can also iterate over it 
K = [[int(n) for n in line.split()][1:] for line in sys.stdin] 

print(max(sum(x**2 for x in combo) % M for combo in itertools.product(*K)))