2016-04-28 2 views
0

Текстовый файл выглядит следующим образом:питон раскол в TXT

helen:9,5,7 

john:5,4,3 

beta:9,9,9 

Im новой для питона, как я разделить это? я получаю ошибки атрибутов:

AttributeError: «список» объект не имеет атрибута «разбить»

def readText(group): 
    snap = [] 
    with open(group+'.txt','r') as text: 
     for line in text: 
      name = line.split(':')[0] 
      score = max(line.split(':')[1].split(',').split()[0]) 
      snap.append([name,score]) 
    export = sorted(snap, key=lambda x:x[0]) 
    print ('Student highest score, in alphabetical order') 
    for L in export: 
     print (L[0]+':'+L[1]) 

if __name__ == '__main__': 
    scores = [0,0,0] 
    readText(group) 

ответ

1

раскол функция ул, как вы можете видеть здесь (поиск str.split) https://docs.python.org/2/library/stdtypes.html

Второй раскол в линии

score = max(line.split(':')[1].split(',').split()[0]) 

разбивает строку '9,5,7' в списке [ '9', '5' , '7']. Вызов раскола на нем снова даст ошибку, которую вы видели.

Вы хотите, чтобы балл был максимальным() списка из второго сплита.

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

line.split(':')[1] 

будет проблема.

+0

спасибо так много, но теперь я получаю это: индекс списка из диапазона –

+0

То есть именно проблема, которую я говорил, вы бы с чтением в пустую строку из текстового файла: IndexError. Вы должны добавить логику управления для определения того, что делать, если len (line.split (':')) <2 – kingledion

0
split() #returns a list, so you can't call split().split()  
score = max(line.split(':')[1].split(',').split()[0]) 

Вы можете просто удалить фронт от перед разбиением

name = line.split(':')[0] 
score = max(s[-(s.find(":")):].split(",")) 
snap.append([name,score]) 
0

Вы можете изменить содержимое для цикла к:

name, scores = line.split(':',2) 
score = max(scores.split(',')) 
snap.append([name,score]) 
0

Я хотел бы использовать регулярное выражение с группами для это.

import re 

def readText(group): 
    snap = [] 
    with open(group+'.txt','r') as text: 
     for line in text: 
      matches = re.match(pattern="^(\w+):([\d\,\.]+)", string=line, flags=re.IGNORECASE) 
      if matches is not None: 
       print(matches.group(1)) 
       print(matches.group(2)) 
       max_score = max([float(x) for x in str.split(matches.group(2), sep=',')]) 
       print(max_score) 

if __name__ == '__main__': 
    readText('data') 
Смежные вопросы