печать строк из файла в пределах включающего алфавитного диапазона, не включая желаемые пределы - PullRequest
2 голосов
/ 21 июня 2020

Проблема, с которой я столкнулся с этой программой, заключается в том, что она не включает границы, хотя я использую операторы> = <=. Также по какой-то причине слова, которые выводятся, разделяются новой строкой, а не печатаются одно за другим. </p>

Например, если выбранный файл .txt содержит:

Aladdin
Batman
Dinosaurs
Edgar
Fruitloop
Mongoose

и выбранные верхняя и нижняя границы:

Batman
Fruitloop

Программа печатает:

Batman

Dinosaurs

Edgar


Вот с чем я работаю. Любая помощь приветствуется!

import os

user_file = input() #reads name of user chosen .txt file containing alphabetized one word per line lists
lo_limit = input() #reads a user chosen word as the inclusive lower alphabetical limit
up_limit = input() #reads a user chosen word as the inclusive upper alphabetical limit

file_handle = open(user_file) #opens user chosen file

lines = file_handle.readlines() #creates by-line string of file contents


#if user chosen file contains words equal to or between bounds, prints words
for ln in lines:
    if ln >= lo_limit \
        and ln <= up_limit:
        print(ln)

Ответы [ 4 ]

1 голос
/ 21 июня 2020

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

lines = """Aladdin
Batman
Dinosaurs
Edgar
Axe # input to break the ascending order
Fruitloop
Mongoose"""

lines = lines.split("\n")

for i in range(len(lines)):
    if "Batman" == lines[i]:
        for j in range(i, len(lines)):
            print(lines[j])
            if "Fruitloop" == lines[j]:
                break

Чтобы получить диапазон строк, вам сначала нужно l oop на строках, найти начальную строку, затем начать цикл от этой строки, пока не найдете конечную строку.

Также: всегда используйте предложение with для открытия файла:

with open(file, "r") as file:
    for line in file:
        # read line by line here
1 голос
/ 21 июня 2020

Это происходит потому, что, когда вы сделаете f.readlines(), это вернет список вроде этого:

f.readlines()
>>>['Aladdin\n', 'Batman\n', 'Dinosaurs\n', 'Edgar\n', 'Fruitloop\n', 'Mongoose']

И когда вы введете up_limit=Edgar, вы будете сравнивать каждый из списка f.readlines() с слово Edgar вот так:

'Aladdin\n'>=lo_limit and 'Aladdin\n'<='Edgar'
>>>True
'Batman\n'>=lo_limit and ''Batman\n''<='Edgar'
>>>True
....
....
....

И когда становится итерацией 'Edgar\n', вы можете проверить это:

'Edgar'>='Edgar\n'
Out[6]: False

И поэтому «Эдгар» не печатается. Вы можете попробовать:

import os

user_file = input() #reads name of user chosen .txt file containing alphabetized one word per line lists
lo_limit = input() #reads a user chosen word as the inclusive lower alphabetical limit
up_limit = input() #reads a user chosen word as the inclusive upper alphabetical limit

with open(str(user_file)) as file_handle:#opens user chosen file
    lines = file_handle.readlines()
    #if user chosen file contains words equal to or between bounds, prints words
    for ln in lines:
        if (ln > lo_limit) or (ln == lo_limit) or (ln < up_limit):
            print(ln)
            if (ln == up_limit+'\n'):
                break

Или вы можете выбрать по индексу:

user_file = input() #reads name of user chosen .txt file containing alphabetized one word per line lists
lo_limit = str(input()) #reads a user chosen word as the inclusive lower alphabetical limit
up_limit = str(input()) #reads a user chosen word as the inclusive upper alphabetical limit

with open(str(user_file)) as file_handle:#opens user chosen file
    lines = file_handle.readlines() #creates by-line string of file contents    
    linesselected=lines[lines.index(lo_limit+'\n'):(lines.index(up_limit+'\n')+1)]
    for i in linesselected:
        print(i.replace('\n',''))
1 голос
/ 21 июня 2020

Хорошо, начиная с того, как вы открываете файл, его проще открыть с помощью диспетчера контекста, подобного этому, затем он обрабатывает открытие / закрытие за вас.

with open('input.txt') as f:
    lines = f.readlines()

О том, почему ваш код не ' t работает, вы должны учитывать, что file_handle.readlines () делает и сохраняет. Я полагаю, у вас сложилось впечатление, что lines содержит:

['Aladdin', 'Batman', 'Dinosaurs', 'Edgar', 'Fruitloop', 'Mongoose']

, хотя на самом деле он содержит:

['Aladdin\n', 'Batman\n', 'Dinosaurs\n', 'Edgar\n', 'Fruitloop\n', 'Mongoose']

Вы можете использовать такое понимание списка, чтобы очистить этот переход от новой строки выкл .:

lines = [l.replace('\n', '') for l in lines]

Тогда ваш лог c должен работать нормально. Таким образом, попробуйте что-то вроде этого:

with open('input.txt') as f:
    lines = f.readlines()

lines = [l.replace('\n', '') for l in lines]

print(lines)

lo_limit = 'Batman'
up_limit = 'Fruitloop'

for ln in lines:
    if ln >= lo_limit and ln <= up_limit:
        print(ln)

, что дает результат:

['Aladdin', 'Batman', 'Dinosaurs', 'Edgar', 'Fruitloop', 'Mongoose']
Batman
Dinosaurs
Edgar
Fruitloop
0 голосов
/ 21 июня 2020

Вам нужно заменить "> =" и "<=" на ">" и "<". Также удалите «\ n» из каждой строки. </p>

Чтобы оставить результат в той же строке, вам нужно использовать атрибут end функции печати. ​​

Остается так:

user_file = input() #reads name of user chosen .txt file containing alphabetized one word per line lists
lo_limit = input() #reads a user chosen word as the inclusive lower alphabetical limit
up_limit = input() #reads a user chosen word as the inclusive upper alphabetical limit

file_handle = open(user_file) #opens user chosen file

lines = file_handle.readlines() #creates by-line string of file contents

#if user chosen file contains words equal to or between bounds, prints words
for ln in lines:
    ln = ln.replace('\n', '')
    if ln > lo_limit \
        and ln < up_limit:
        print(ln, end=' ')

вывод:

$ python file.py 
arquivo.txt
Aladdin
Mongoose
Batman Dinosaurs Edgar Fruitloop
...