Принимая входные данные, содержащие "или" с argparse - PullRequest
2 голосов
/ 29 октября 2011

Я сделал быстрый скрипт на python, который конвертирует в Unicode из ASCII и обратно. Я беру ввод через argparse, поэтому он должен быть заключен в кавычки, то есть ./Converter.py -a "есть мой друг". Затем скрипт выведет значения Unicode, разделенные запятыми.

Конечно, 'сломает вход, и я знаю, что могу избежать', поставив перед ним \; однако по какой-то причине это останавливает добавление запятой. Например:

./Convert.py "\"hi\""

Выходы:

34104, 105, 34

Как видите, между 34 и 104 должна быть запятая и пробел. Это код:

def CharCode(text):
    print "Unicode values are:",
    length = len(text) 
    for letter in text: 
            Unicode_values = ord(letter) 
            sys.stdout.write(str(Unicode_values)) 
            if letter != text[-1]: 
                    sys.stdout.write(', ')
    sys.stdout.write('\r\n') 

Если я уберу

if letter != text[-1]: 

Это останавливает проблему, но затем добавляется запятая в самом конце строки значения Unicode, что мне не нужно.

Таким образом, мои вопросы: а) как я могу предотвратить это? и б) есть ли лучший способ получить входные данные этого типа, я бы лучше настроить, например, raw_input?

Любая помощь очень ценится, спасибо!

1 Ответ

3 голосов
/ 29 октября 2011

Ваше состояние

if letter != text[-1]: 

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

for i, letter in enumerate(text):
    #stuff
    if i < len(text) - 1:
        sys.stdout.write(', ')

но лучше использовать метод соединения:

print u', '.join([str(value) for value in unicode_values])

Кроме того, если вы не хотите использовать кавычки, чтобы ваша оболочка отправляла ваш скрипт в качестве одного аргумента, argparse имеет nargs параметров ( документов ), например '+' для сбора столько аргументов, сколько есть. Тем не менее, вам все равно придется избегать кавычек, которые вы хотите, и вам придется делать предположение о пробелах между этими аргументами. (что-то вроде ' '.join(args) только приблизит ваш ввод)

...