Получение пользовательского ввода

Я запускаю это:

import csv
import sys
reader = csv.reader(open(sys.argv[0], "rb"))
for row in reader:
    print row

И получаю в ответ:

['import csv']
['import sys']
['reader = csv.reader(open(sys.argv[0]', ' "rb"))']
['for row in reader:']
['    print row']
>>> 

Для sys.argv[0] я хотел бы, чтобы он предлагал мне ввести имя файла.

Как мне заставить его предлагать мне ввести имя файла?


person Alex Gordon    schedule 27.07.2010    source источник
comment
Вы хотите, чтобы имя файла было введено пользователем или аргументом командной строки? (например, python myScript.py inputfile.txt)   -  person Rob Lourens    schedule 27.07.2010
comment
Поскольку вы только начинаете знакомиться с Python, было бы неплохо просмотреть руководство и изучить основы языка, а не пытаться изучить только те функции, которые вам нужны, и искать ответы на StackOverflow, когда вы не можете найти что-то. Конечно, это займет больше времени, но вы лучше поймете язык.   -  person chimeracoder    schedule 27.07.2010
comment
@chimeracoder: конечно, он пошел легким путем, но именно эти вопросы позволяют мне быстро найти ответ, если я просто «ищу его» в Google. Также для небольшого проекта и не так уж много времени python является предпочтительным инструментом из-за его простоты, хорошо, что не нужно читать целое руководство.   -  person John Smith    schedule 09.06.2013


Ответы (5)


В python 3.x используйте input() вместо raw_input()

person Sunny Tambi    schedule 20.03.2016
comment
Есть ли конкретная причина, по которой input() лучше, чем raw_input(), начиная с 3.x? Кроме того, что набирать легче ... - person Silver Ringvee; 05.04.2016
comment
@SilverRingvee raw_input не существует. - person wizzwizz4; 08.06.2016
comment
довольно веская причина. - person Ulysse Mizrahi; 27.07.2017

Используйте raw_input() функцию для получения данных от пользователей (2.x):

print "Enter a file name:",
filename = raw_input()

или просто:

filename = raw_input('Enter a file name: ')

или если в Python 3.x:

filename = input('Enter a file name: ')
person Dave Webb    schedule 27.07.2010
comment
@Longpoke - Хорошая точка зрения; обновили ответ. - person Dave Webb; 27.07.2010
comment
В Python 3 это просто input() - предостережение: в 2.x тоже есть метод ввода, но он eval () является вводом и поэтому является злом. - person ; 27.07.2010
comment
Есть ли способ написать подсказку, которая будет работать для обоих? - person Agostino; 09.04.2015
comment
@Agostino try: input = raw_input ; except NameError: pass; А потом input свободно пользуйся. (В принципе, если raw_input существует, назначьте его входу имени. Если нет, то вы используете python3). Точка с запятой на самом деле должна быть новой строкой - person NightShadeQueen; 31.07.2015

sys.argv[0] - это не первый аргумент, а имя файла программы Python, которую вы в данный момент выполняете. Я думаю, ты хочешь sys.argv[1]

person Nikolaus Gradwohl    schedule 27.07.2010
comment
Не то, что он просил, но тем не менее полезно - person Allison; 23.04.2013

Чтобы дополнить приведенные выше ответы чем-то более пригодным для повторного использования, я придумал это, которое продолжает подсказывать пользователю, считается ли ввод недопустимым.

try:
    input = raw_input
except NameError:
    pass

def prompt(message, errormessage, isvalid):
    """Prompt for input given a message and return that value after verifying the input.

    Keyword arguments:
    message -- the message to display when asking the user for the value
    errormessage -- the message to display when the value fails validation
    isvalid -- a function that returns True if the value given by the user is valid
    """
    res = None
    while res is None:
        res = input(str(message)+': ')
        if not isvalid(res):
            print str(errormessage)
            res = None
    return res

Его можно использовать так, с функциями проверки:

import re
import os.path

api_key = prompt(
        message = "Enter the API key to use for uploading", 
        errormessage= "A valid API key must be provided. This key can be found in your user profile",
        isvalid = lambda v : re.search(r"(([^-])+-){4}[^-]+", v))

filename = prompt(
        message = "Enter the path of the file to upload", 
        errormessage= "The file path you provided does not exist",
        isvalid = lambda v : os.path.isfile(v))

dataset_name = prompt(
        message = "Enter the name of the dataset you want to create", 
        errormessage= "The dataset must be named",
        isvalid = lambda v : len(v) > 0)
person Kyle Falconer    schedule 07.06.2016
comment
... Не совсем отвечает на вопрос ... - person wizzwizz4; 08.06.2016
comment
@ wizzwizz4, конечно. Вы читали, что я поставил? - person Kyle Falconer; 08.06.2016
comment
Он загрязняет глобальное пространство имен (перезаписывая ввод в Python 2), и его очень сложно использовать (что такое self?). Я проголосовал за, но нужно немного поработать над документацией. - person wizzwizz4; 08.06.2016
comment
self там не должно было быть, поэтому я удалил его. Я изменил input на совместимость с Python 2/3. Ознакомьтесь с комментариями в других ответах. - person Kyle Falconer; 08.06.2016
comment
Теперь имеет больше смысла. - person wizzwizz4; 08.06.2016
comment
У меня было странное поведение при использовании this в моем решении. Конкретная ошибка, которую я получал, была UnboundLocalError: local variable 'input' referenced before assignment. Чтобы исправить это, я переназначил ввод через модуль builtins. try: input = raw_input except NameError: import builtins; input = builtins.input; pass. Я добавил точки с запятой только для удобства чтения в этом комментарии. - person nmante; 25.06.2016

Используйте следующий простой способ интерактивного получения пользовательских данных с помощью запроса в качестве аргументов того, что вы хотите.

Версия: Python 3.X

name = input('Enter Your Name: ')
print('Hello ', name)
person Ezra A.Mosomi    schedule 28.03.2017