Ошибки Python при форматировании строк, которые пришли из списка строк?
Учитывая содержание моего файла:
"ID","Name","Type 1","Type 2","Generation","Legendary"
1,"Bulbasaur","Grass","Poison",1,"FALSE"
6,"Charizard","Fire","Flying",1,"FALSE"
4,"Charmander","Fire","",1,"FALSE"
169,"Crobat","Poison","Flying",2,"FALSE"
146,"Moltres","Fire","Flying",1,"TRUE"
643,"Reshiram","Dragon","Fire",5,"TRUE"
641,"Tornadus, (Incarnate Form)","Flying","",5,"TRUE"
Я использую readlines(), чтобы создать список каждой строки в виде отдельной строки.
Затем я пытаюсь взять эти строки и отформатировать их в следующем формате:
'Bulbasaur': (1, 'Grass', 'Poison', 1, False)
Мне нужно убедиться, что точные цитаты верны и что все строчные и прописные буквы верны. Я также должен убедиться, что типы превращены в то, что им нужно.
Когда я иду, чтобы перебрать или отформатировать строки (то есть разделить и разделить), я получаю несколько ошибок:
TypeError: 'int' object is not iterable
AttributeError: 'int' object has no attribute 'split'
Я серьезно смущен тем, как это должно работать. Моя общая функция работает, но не возвращает правильные результаты. Пример: он возвращает информацию чармандера в словаре, а не бульбазавра.
- Мне нужно взять результаты из readlines() и получить каждую строку в виде строки
- Мне нужно отформатировать эту строку в формате, указанном выше
- Затем, когда у меня есть этот формат, мне нужно превратить его в словарь.
Вот моя функция, которая действительно повсюду:
def read_info_file(filename): #accept file
file= open(filename)
lines=file.readlines()[1:] #skip first header line
d={}
for line in lines:
split_line=line.split(',') #get individual strings
legendary=True
if 'F' == split_line[-1].strip('"')[0]: #check last position if t or f to format legendary correctly
legendary=False
if len(split_line) > 6:
(k,v)=(split_line[1]+split_line[2].strip('"'), #puts right order and removes excess quotations
(int(split_line[0]),split_line[3].strip('"'),split_line[4].strip('"'),
int(split_line[5]),legendary))
else:
(k,v)=(split_line[1].strip('"'),
(int(split_line[0]),split_line[2].strip('"'),split_line[3].strip('"'),
int(split_line[4]),legendary))
d.update([(k,v)])
file.close()
return d
1 ответ
Использование встроенного csv
Модуль упрощает вещи:
import csv
from pprint import pprint
def read_info_file(filename):
with open(filename,'r',newline='') as f:
r = csv.reader(f)
next(r) # skip header
d = {}
for id,name,type1,type2,generation,legendary in r:
d[name] = int(id),type1,type2,int(generation),legendary=='TRUE'
return d
pprint(read_info_file('input.txt'))
Выход
{'Bulbasaur': (1, 'Grass', 'Poison', 1, False), 'Charizard': (6, 'Fire', 'Flying', 1, False), 'Charmander': (4, 'Fire', '', 1, False), 'Crobat': (169, 'Poison', 'Flying', 2, False), 'Moltres': (146, 'Fire', 'Flying', 1, True), 'Reshiram': (643, 'Dragon', 'Fire', 5, True), 'Tornadus, (Incarnate Form)': (641, 'Flying', '', 5, True)}