Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于格式化输出记录并写入文件的Python函数不起作用_Python_Function - Fatal编程技术网

用于格式化输出记录并写入文件的Python函数不起作用

用于格式化输出记录并写入文件的Python函数不起作用,python,function,Python,Function,客户端需要特定格式的输出。我有一个以管道分隔的文件,其中有4个字段作为输入;注释id、注释日期、注释用户、注释文本。输入注释文本可以是10到150个字符。格式化输出记录的逻辑要求在72个字符处或之前的分词处插入插入插入符号(^),最大总字段长度为1981个字符。该逻辑还需要按日期分开的输出记录。我想用一个函数来格式化和写入输出记录,而不是重复相当复杂的编码,但它一直失败,我被难住了 错误消息是: Unhandled exception while debugging... Traceback (

客户端需要特定格式的输出。我有一个以管道分隔的文件,其中有4个字段作为输入;注释id、注释日期、注释用户、注释文本。输入注释文本可以是10到150个字符。格式化输出记录的逻辑要求在72个字符处或之前的分词处插入插入插入符号(^),最大总字段长度为1981个字符。该逻辑还需要按日期分开的输出记录。我想用一个函数来格式化和写入输出记录,而不是重复相当复杂的编码,但它一直失败,我被难住了

错误消息是:

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
调试时出现未处理的异常。。。 回溯(最近一次呼叫最后一次): 文件“C:\Python37\test\u scripts\Outbound\u Notes.py”,第137行,在 输出注释(保留注释) 文件“C:\Python37\test\u scripts\Outbound\u Notes.py”,第49行,在Output\u Note中 y=len(保留字[i]) 索引器:列表索引超出范围 这是我的剧本

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
导入字符串
导入系统
导入操作系统
#用于测试的硬编码DD文件名。
ifilename='TEST_INPUT.DAT'
ofilename='TEST_OUTPUT.TXT'
#ifilename=sys.argv[1]。替换(“\\”,“/”)
#ofilename=sys.argv[2]。替换(“\\”,“/”)
acctNbrOutput=False
hold_id=“”
def输出注释(注释文字):
maxnote1=72
maxnote2=1981
i=0
w=0
y=0
z=0
hold\u word=note\u text.split()
word\u count=len(注意\u text.split())
临时注释=保留用户
z=6
w=6
当i=maxnote1时:
临时注释=临时注释+“^”+保留字[i]
z=y
#如果结束
其他:
noteRecord='12001'+保留日期+''+临时备注+'\n'
outputRecord=noteRecord
f2.写入(输出记录)
临时注释=保留用户
z=6
w=6
临时注释=临时注释+“”+保留字[i]
z=z+y
w=w+y
#如果结束
i=i+1
#边结束边循环
如果临时通知!=等待用户:
noteRecord='12001'+保留日期+''+临时备注+'\n'
outputRecord=noteRecord
f2.写入(输出记录)
#如果结束
将open(ifilename,'r')作为f1:
f1.seek(0)#确保位于文件的开头。。
first_char=f1。读取(1)#获取第一个字符
如果不是第一个字符:
打印(“文件为空”)#第一个字符是空字符串。
打开(ofilename,“w+”)。关闭()
其他:
f1.seek(0)#第一个字符不是空的,请返回文件开头。
打开(ofilename,'w')作为f2:
#maxnote1=72
#maxnote2=1981
#循环浏览notes输入文件中的每条记录
对于f1中的行:
line=line.strip()
split_note=line.split(“|”)
注释id=拆分注释[0]
注日期=拆分注[1]
注释用户=拆分注释[2]
注释文本=拆分注释[3]
#读取第一个注释时,初始化保留字段。
如果未保留您的id:
打印(保留id)
hold\u id=注释\u id
保留日期=注释日期
保持用户=注意用户
保留注释=注释文本
acctRecord='10001'+str(保持id).zfill(10)+'\n'
输出记录=附件记录
f2.写入(输出记录)
acctNbrOutput=True
#如果已经为患者阅读了所有注释
elif hold_id!=注:
如果不接受输出:
acctRecord='10001'+str(保持id).zfill(10)+'\n'
输出记录=附件记录
f2.写入(输出记录)
acctNbrOutput=True
#如果结束
输出注释(保留注释)
outputRecord='19999'+'\n'
f2.写入(输出记录)
hold\u id=注释\u id
保留日期=注释日期
保持用户=注意用户
保留注释=注释文本
acctRecord='10001'+str(保持id).zfill(10)+'\n'
输出记录=附件记录
f2.写入(输出记录)
acctNbrOutput=True
#如果文件包含来自多个日期的注释
elif hold_date!=注:日期:
如果不接受输出:
acctRecord='10001'+str(保持id).zfill(10)+'\n'
输出记录=附件记录
f2.写入(输出记录)
acctNbrOutput=True
#如果结束
输出注释(保留注释)
保留日期=注释日期
保留注释=注释文本
其他:
保留注释=保留注释+“”+注释文本
#如果结束
#循环结束
如果不接受输出:
acctRecord='10001'+str(保持id).zfill(10)+'\n'
输出记录=附件记录
f2.写入(输出记录)
acctNbrOutput=True
#如果结束
输出注释(保留注释)
outputRecord='19999'+'\n'
f2.写入(输出记录)
outputRecord='**结束'
f2.写入(输出记录)
#如果结束
#如果结束

始终尽量减少代码,只显示错误。在您的情况下,错误出现在行中

  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
注释

1) 不要重复你自己,你正在做
note\u text.split()
两次,最好写:

hold_word = note_text.split()
word_count = len(hold_word)
2) 据我所知,您仅使用
I
访问索引处的列表,因此您可以在
hold_word = note_text.split()
word_count = len(hold_word)
for word in hold_word