如何读取正确的int列表的输入文件? python,list,

时间:2017-07-26 09:08:15

标签: python list file input

我的输入是一个int元素列表,我将列表保存为文件(不多,不少),到目前为止工作正常。 但是当把文件作为我的int列表的输入时,我得到错误的列表元素或代码的错误。数字可以是任何(正数)int,它是偶数。

输入文件(通过键盘):

1, 2, 3, 4

文件内容:

[1, 2, 3, 4]
输入文件后

列表:

['[1', '2', '3', '4]']

应该是:

[1, 2, 3, 4]

我文件中的filst元素需要再次为int。

l = list_from_file
a = 0
l [ 1 ] = 2

def take ( profil , s , succ) :
    a = 0
    j = 0
    n = 0
    erf = False
    if s :
        print ( "\nPut your list in." )# supposed to be a list
        profil = [ int ( x ) for x in input ( ).split ( sep = ', ' ) ]
        s = False
    else :
        profil = input ( "\nPut your list in. Again." ).split ( sep = ', ' )
    erf = check( profil )
    if not erf :
        erf = ask ( profil , s , succ)
    return profil , s

def check( profil ) :
    a = 0
    b = True
    n = 0
    for n in profil [ : ] :
#        if  int ( profil [ n ] ) < 0 : #Some confusing errors I tried to fix with these possibilities...
#        if  profil [ n ] < 0 :
        if  int ( n ) < 0 :
#        if  n < 0 :
            b = False
            exit
        a += 1
    a -= 1
    if ( profil [ -1 ] != profil [ a ] ) : 
        b = False
    return b
def ask( profil , s , succ) :
    show( profil , succ)
    s = check( profil )
    if s :
        profil = input ( "\nPut your list in." ).split ( sep = ', ' )        
        s = False
    else :
        profil = input ( "\nPut your list in. Again." ).split ( sep = ', ' )
#    if profil [ 0 ] != 0 :
#        s = ask
    return succ, s

def save( profil , path) :
    path = input ( "Put your path in: " )
    erf = False
    if os.path.isfile ( path) : 
        inp= input ( "File already exists. Overwrite[u], bring as input [e] or ignore[i]?" )
        if inp== 'u' or inp== 'U' :
            f = open ( path, "w" )
            f.write ( str ( profil ) )
        elif inp== 'e' or inp== 'E' :
            f = open ( path, "r" )                                                  
            profil = f.read ( ).split ( sep = ', ' ) 
        elif inp== 'i' or inp== 'I' :
            f = open ( path, "r" )                                             
            print ( "File closed." )
            f = f.close
        else :
            inp= input ( "Confusing input. Continue with any key." )
            return profil
    else :
        print ( "File made." )
        f = open ( path, "w" )
        f.write ( profil )
        f = f.close
    return profil
def bring( path, profil ) :
    path= input ( "\nPath: " )    
    f = open ( path, "r" )
    profil = f.read ().split ( sep = ', ' )
#    profil = [ int ( x ) for x in input ( ).split ( sep = ', ' ) ]
#    profil = profil ().read().replace ( '[' , '' )
#    profil = f.read [ : ].replace ( ']' , '' )#also some variants I tried.
    f = f.close
#    profil = strrep ( profil )#new function I tried to
    print (profil)
    return profil


def delete ( path, succ) :
    erf = False
    path= input ( "Put in deleting path." )
    if os.path.isfile ( path) :
        os.remove ( path)
                print ( "File " + path+ " deleted." )
        erf = True
    else :
        print ( "Datei nicht gefunden." )
    return erf

inp = input("Please start.")
while ( inp != 'q' ) and ( inp != 'Q' ) :
    elif inp == 'N' :
        inp = input ( "and now?" )
    elif inp == 'p' or inp == 'P' :  
        profil , s = take ( profil , s , succ )
        succ = zeigen ( profil , succ )
        if profil [ 0 ] == '0' :
            print ( "Profil not usable.." )
        else :
            inp = input ( "and now?" )
    elif inp == 'z' or inp == 'Z' :
        succ = show ( profil , succ )
        inp = 'N'
    elif inp == 's' or inp == 'S' :
        profil = save ( profil , path )
        inp = 'N'
    elif inp == 'e' or inp == 'E' :
        profil = bring( path , profil )
        print(profil )
        dif = profil [ 0 ]
        inp = 'N'
    elif inp == 'l' or inp == 'L' :
        succ = delete ( path , succ )
        inp = 'N'
    else :
        inp = input ( "unknown command. Quit with Q..." )
if ( inp == 'q' ) or ( inp == 'Q' ) :
    quit ( )

2 个答案:

答案 0 :(得分:1)

这里有几种选择。

  • 将每个数字保存在自己的行而不是实际列表中,然后将文件读取为整数列表:

    with open(filename) as f:
        list_of_ints = [int(line.strip()) for line in f]
    
  • 如果您坚持按原样将列表写入文件,则可以使用literal_eval使用eval):

    from ast import literal_eval
    
    with open(filename) as f:
        list_of_ints = literal_eval(f.read().strip())
    

请记住我使用strip()来删除可能的前导/尾随空格和/或换行符。

答案 1 :(得分:0)

如果要将列表保存到文件中,并假设list_from_file是已读取的字符串表示形式。使用ast来评估列表。

getElementById