Проверка символов в строке входного файла и возврат, если они содержат только допустимые символы - PullRequest
0 голосов
/ 13 ноября 2018

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

В этом примере я говорю, что строка входного файла может содержать ABCabc или пробел. Если строка содержит только эти вещи, слово Valid должно быть напечатано. Если это просто пробел или он содержит какие-либо другие символы или буквы, он должен вывести «Invalid».

Вот что я придумал:

Кажется, я не могу распечатать «Действительный»

Можете ли вы сказать, почему? Спасибо!

input = sys.argv[1]
input = open(input,"r")
correctInput = ‘ABCabc ‘

line1 = input.readline()

while line1 != "":
    if all(char in correctInput for char in line1):
        print “Valid”
        line2 = input.readline()
    else:
        print “Invalid”
        line2 = input.readline()
    line1 = line2

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Это потому, что readline не удаляет '\ n' с конца строки. Вы можете игнорировать эту проблему, разбивая содержимое файла на строки и затем проверяя их одну за другой.

import sys

file_name = sys.argv[1]
file = open(file_name ,"r")
correctInput = 'ABCabc '

lines = file.read().splitlines()

for line1 in lines:
    if all(char in correctInput for char in line1):
        print 'Valid'
    else:
        print 'Invalid'
0 голосов
/ 13 ноября 2018

Если вы напечатаете значение line1 перед оператором if else, вы увидите, что в нем есть символ перевода строки. (Символ \n.) Это символ, который добавляется в конец каждой строки всякий раз, когда вы нажимаете клавишу ввода на клавиатуре, и вам необходимо либо удалить символы новой строки, либо включить их в качестве допустимого ввода.

Чтобы включить его в качестве действительного ввода

Изменить correctInput = 'ABCabc '

до

correctInput = 'ABCabc \n'.


Или для отмены изменения символов новой строки

if all(char in correctInput for char in line1):

до

if all(char in correctInput for char in line1.replace('\n', '')):


Любой метод будет работать.

Кстати, input - это функция в Python. Хотя вам разрешено использовать его в качестве имени переменной, это не позволит вам использовать функцию ввода в вашей программе. Из-за этого считается плохой практикой использовать любые имена встроенных функций в качестве имен переменных.


Решение RegEx

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

import re

with open(sys.argv[1]) as fh:
  valid_lines = re.findall('^[ABCabc ]+\n', fh.read())

Находит любые допустимые строки, используя шаблон '^[ABCabc ]+\n'. Что делает этот шаблон регулярного выражения?

  • Символ ^ обозначает начало строки
  • Затем наступает [ABCabc ]. При использовании скобок разрешены только символы внутри этих скобок.
  • + после скобок означает, что те символы, которые в скобках, должны быть найдены 1 или более раз.
  • И, наконец, мы проверяем, что за найденными допустимыми символами следует символ новой строки (\n). Это гарантирует, что мы проверили всю строку на наличие допустимых символов.
...