Python функция форматирования выходной записи и записи в файл не работает - PullRequest
0 голосов
/ 14 апреля 2020

Клиент требует вывода в указанном формате c. У меня есть файл с разделителями трубы с 4 полями в качестве входных данных; идентификатор заметки, дата заметки, пользователь заметки, текст заметки. Вводимый текст заметки может быть от 10 до 150 символов. Логика c для форматирования выходной записи требует вставки каретки (^) при разрыве слова не более 72 символов, вплоть до максимальной общей длины поля 1981 символа. Лог c также требует отдельных выходных записей по дате. Вместо того, чтобы повторять довольно сложное кодирование, я хочу использовать функцию для форматирования и записи выходной записи, но она продолжает давать сбой, и я в тупике.

Сообщение об ошибке:

Unhandled exception while debugging...
Traceback (most recent call last):
  File "C:\Python37\test_scripts\Outbound_Notes.py", line 137, in <module>
    Output_Note(hold_note)
  File "C:\Python37\test_scripts\Outbound_Notes.py", line 49, in Output_Note
    y = len(hold_word[i])
IndexError: list index out of range

Вот мой сценарий

import string
import sys
import os

# hard codedd file-names for testing.
ifilename = 'TEST_INPUT.DAT'
ofilename = 'TEST_OUTPUT.TXT'

#ifilename = sys.argv[1].replace("\\", "/")
#ofilename = sys.argv[2].replace("\\", "/")

acctNbrOutput = False
hold_id = ''

def Output_Note(note_text):
    maxnote1 = 72
    maxnote2 = 1981
    i = 0
    w = 0
    y = 0
    z = 0
    hold_word = note_text.split()
    word_count = len(note_text.split())
    temp_note = hold_user
    z = 6
    w = 6
    while i <= word_count:
        y = len(hold_word[i])
        w = w + y
        if w < maxnote2:
            w = w + 1
            z = z + 1
            if (z + y) < maxnote1:
                temp_note = temp_note + " " + hold_word[i]                            
                z = z + y
            elif (z + y) >= maxnote1:
                temp_note = temp_note + "^" + hold_word[i] 
                z = y
#           end if
        else:
            noteRecord = '12001' + hold_date + '   ' + temp_note + '\n'
            outputRecord = noteRecord
            f2.write(outputRecord)
            temp_note = hold_user
            z = 6
            w = 6
            temp_note = temp_note + " " + hold_word[i]                            
            z = z + y
            w = w + y
#       end if
        i = i + 1
#   end while loop
    if temp_note != hold_user:
        noteRecord = '12001' + hold_date + '   ' + temp_note + '\n'
        outputRecord = noteRecord
        f2.write(outputRecord)
#   end if

with open(ifilename, 'r') as f1:
    f1.seek(0) #ensure you're at the start of the file..
    first_char = f1.read(1) #get the first character
    if not first_char:
        print("file is empty") #first character is the empty string.
        open(ofilename, "w+").close()
    else:
        f1.seek(0) #first character wasn't empty, return to start of file.
        with open(ofilename, 'w') as f2:  
#           maxnote1 = 72
#           maxnote2 = 1981
#           loop through each record in the notes input file
            for line in f1:
                line = line.strip()
                split_note = line.split('|')
                note_id = split_note[0]
                note_date = split_note[1]
                note_user = split_note[2]
                note_text = split_note[3]
# When the first note is read, initialize the hold fields.                          
                if not hold_id:
                    print(hold_id)
                    hold_id = note_id
                    hold_date = note_date
                    hold_user = note_user
                    hold_note = note_text
                    acctRecord = '10001' + str(hold_id).zfill(10) + '\n'
                    outputRecord = acctRecord
                    f2.write(outputRecord)
                    acctNbrOutput = True
# If the notes have all been read for the patient
                elif hold_id != note_id:
                    if not acctNbrOutput:
                        acctRecord = '10001' + str(hold_id).zfill(10) + '\n'
                        outputRecord = acctRecord
                        f2.write(outputRecord)
                        acctNbrOutput = True
#                   end if
                    Output_Note(hold_note)
                    outputRecord = '19999' + '\n'
                    f2.write(outputRecord)
                    hold_id = note_id
                    hold_date = note_date
                    hold_user = note_user
                    hold_note = note_text
                    acctRecord = '10001' + str(hold_id).zfill(10) + '\n'
                    outputRecord = acctRecord
                    f2.write(outputRecord)
                    acctNbrOutput = True
# If file contains notes from multiple dates                    
                elif hold_date != note_date:
                    if not acctNbrOutput:
                        acctRecord = '10001' + str(hold_id).zfill(10) + '\n'
                        outputRecord = acctRecord
                        f2.write(outputRecord)
                        acctNbrOutput = True
#                   end if
                    Output_Note(hold_note)
                    hold_date = note_date
                    hold_note = note_text
                else:
                    hold_note = hold_note + ' ' + note_text
#               end if
#           end for loop
            if not acctNbrOutput:
                acctRecord = '10001' + str(hold_id).zfill(10) + '\n'
                outputRecord = acctRecord
                f2.write(outputRecord)
                acctNbrOutput = True
#           end if
            Output_Note(hold_note)
            outputRecord = '19999' + '\n'
            f2.write(outputRecord)
            outputRecord = '**END'
            f2.write(outputRecord)
#   end if
#end if

1 Ответ

1 голос
/ 14 апреля 2020

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

  y = len(hold_word[i])

Сбор материала, необходимого для того, чтобы все здесь было определено, дает вам следующее:

note_text = "Some example line\n" #I have no idea what your input might look like
hold_word = note_text.split()
word_count = len(note_text.split())
while i <= word_count:
    y = len(hold_word[i])
    i=i+1

Это весь код, необходимый для воспроизведения твоя ошибка! Теперь пришло время проверить сообщение об ошибке: **IndexError: list index out of range**, поэтому кажется, что индекс i для доступа к списку становится слишком большим. На минимальном примере мы можем быстро определить, какое наибольшее возможное значение i, поскольку i<=word_count и word_count = len(note_text.split()), наибольшее значение i равно len(note_text.split()), но самый большой индекс в списке равен len(note_text.split()) - 1, поэтому поменяйте ваше состояние, чтобы убедиться, что индекс всегда меньше, чем длина:

note_text = "Some example line\n"
hold_word = note_text.split()
word_count = len(note_text.split())
while i < word_count: #Note, now < instead of <=
    y = len(hold_word[i])
    i=i+1

Примечания :

1) Не делайте Повторите, вы делаете note_text.split() дважды, лучше напишите:

hold_word = note_text.split()
word_count = len(hold_word)

2) Насколько я вижу, вы используете i только для доступа к списку по индексу, так что вы можно изменить while l oop на a для l oop:

for word in hold_word

, а затем использовать word вместо hold_word[i]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...