Код Python, отсекающий часть слова из списка

#python

#python

Вопрос:

Этот код отсекает часть слова в моем списке. Кто-нибудь знает, почему?

 # setup the book list
master_book_list = []

# read in the file and store as a list
def read_file():
    global master_book_list
    infile = open("bookdata.txt", 'r')

    # reading each line of the file and putting details of the books into a list of lists
    for row in infile:
        book_details = []
        start_pos = 0
        if not row.startswith('#'):
            for index in range(len(row)):
                if row [index] == ',' or index == len(row) -1:
                    book_details.append(row[start_pos:index].strip())
                    start_pos = index   1

            master_book_list.append(book_details)
    infile.close()
 

Комментарии:

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

2. Каковы ваши входные, выходные и ожидаемые выходные данные? В чем проблема?

3. Retl34 имеет правильный ответ на ваши потребности. Проблема в вашем коде, скорее index == len(row) -1 всего, в проверке. Последующий оператор добавит последний сегмент минус последний символ ( row[start_pos:index] соответствует ros[start_pos:len(row)-1] )

4. То, что написал @Kendas, звучит разумно. Если это не решит вашу проблему, возможно, вы могли бы добавить несколько примеров ввода, фактического вывода и желаемого вывода. Тогда, возможно, хороший отладчик поможет вам найти ответы на подобные вопросы. Если вы используете IDE, такую как spyder, стоит проверить, как можно запустить отладчик.

Ответ №1:

Похоже, у вас есть список элементов, разделенных запятыми, в вашем файле. Я бы предложил вместо ручного поиска выполнить разделение списка. Если это на самом деле файл csv. Я бы рекомендовал использовать библиотеку csv python вместо ручного синтаксического анализа.

 def read_file():
    global master_book_list
    #Updated to the preferred 'with open'
    with open("bookdata.txt", 'r') as infile:
        # reading each line of the file and putting details of the books into a list of lists
        for row in infile:
            if not row.startswith('#'):
                book_details = [item.strip() for item in row.split(',')]
                master_book_list.append(book_details)

 

Кроме того, вам, вероятно, следует сделать очистку кода следующим образом и вызвать его с помощью read_file(master_book_list, 'bookdata.txt')

 def read_file(masterBookList, filename):
    #Updated to the preferred 'with open'
    with open(filename, 'r') as infile:
        # reading each line of the file and putting details of the books into a list of lists
        for row in infile:
            if not row.startswith('#'):
                masterBookList.append([item.strip() for item in row.split(',')])


 

Комментарии:

1. С таким же успехом можно избавиться от этого глобального оператора и вернуться master_book_list из функции.

2. да, я не был уверен, как далеко сократить исходный код. Добавлена более чистая версия. Спасибо @Reti43

3. Большое спасибо, ребята