Почему в nlist записывается дополнительный элемент / строка (''), когда мне нужны только строки, добавленные пользователем? - PullRequest
0 голосов
/ 29 октября 2018

Пример: я набираю положительные числа: 1, 2, 3, 4, а затем заканчиваю первую функцию, набирая -1. Список (nlist), отображаемый во второй функции, представляет собой ['1', '2', '3', '4', '']. Откуда взялся этот дополнительный пятый предмет и как мне его предотвратить?

def pos_num():

    # Open num.txt and define num
    num_list = open('num.txt', 'w')
    num = 1

    # While num is positive, ask user for input
    while num >= 0:
        num = int(input('Type + number to add to num_list, - number to end: '))

        # If user input is positive: \
        # convert to str, add to list, convert to int to continue loop
        if num >= 0:
            num = str(num)
            num_list.write(num + '\n')
            num = int(num)

        # If user input is negative: \
        # close num.txt and inform user
        else:
            num_list.close()
            print('List has been written to num.txt')

# Call program 1
pos_num()

# Program 2: Number File Reader
def nfread():

    # Ask user for filename to open
    filename = input('Filename: ')
    infile = open(filename, 'r')

    # Create empty list
    nlist = []

    # Read first line, strip '\n', append to nlist, begin line count
    line = infile.readline()
    line = line.rstrip('\n')
    nlist.append(line)
    count = 1

    # While line is not empty: \
    # read line, strip '\n', append line to nlist, add 1 to count
    while line != '':
        line = infile.readline()
        line = line.rstrip('\n')
        nlist.append(line)
        count += 1
        print(line, count)

    # Close num.txt
    infile.close()

    # Return nlist
    return nlist

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Ваш цикл while проверяет, не является ли текущая строка не пустой, но добавляет следующую строку в nlist. Вы можете исправить это, определив следующую строку перед циклом.

line = infile.readline()
while line != '':
0 голосов
/ 29 октября 2018

Прочитайте весь файл за один раз. read().splitlines() удалит окончания строк

def nfread():

    # Ask user for filename to open
    filename = input('Filename: ')
    with open(filename, 'r') as inflile: 
        nlist = inflile.read().splitlines()
        count=len(nlist)
    return nlist
0 голосов
/ 29 октября 2018

Рассмотрите возможность изменения этого блока:

# Read first line, strip '\n', append to nlist, begin line count
line = infile.readline()
line = line.rstrip('\n')
nlist.append(line)
count = 1

# While line is not empty: \
# read line, strip '\n', append line to nlist, add 1 to count
while line != '':
    line = infile.readline()
    line = line.rstrip('\n')
    nlist.append(line)
    count += 1
    print(line, count)

На что-то вроде

count = 0
for line in infile:
    line = line.rstrip()
    if line:
        nlist.append(line)
        count += 1
        print(line, count)

Из всех изменений, тем, что должно исправить вашу программу, является добавление if line: - это приведет к тому, что ваша программа не добавит пустой элемент в ваш список (результат вызова .rstrip() только на символ новой строки).

...