2015-04-19 2 views
1

Я студент, пытающийся изучать Python, и я нахожусь в тупике, превращая файл-объект в текст. Вот мой код:Получение текста из файлового объекта Python

def file2table(filename, mycaption=None): 

    with open(filename, 'r') as file: 
     return lists2table(file, mycaption) 

def lists2table(mylists, mycaption=None): 

    result = '<table>\n' 
    if mycaption != None: 
     result += '<caption>' + mycaption + '</caption>\n' 
    result += list2THrow(mylists[0]) + '\n' 
    for item in mylists[1:]: 
     result += list2TDrow(item) + '\n' 
    result += '</table>' 
    return result 

Ошибка:

result = '<table>\n<caption>Table with Forbes Top 50 Women</caption>\n', global list2THrow = <function list2THrow>, mylists = <_io.TextIOWrapper name='data/forbeswomen_ascii.tsv' mode='r' encoding='ANSI_X3.4-1968'> 
TypeError: '_io.TextIOWrapper' object is not subscriptable 
     args = ("'_io.TextIOWrapper' object is not subscriptable",) 
     with_traceback = <built-in method with_traceback of TypeError object> 
+0

Я думаю, что вы хотите 'возвращение lists2table (file.readlines(), mycaption)', как 'lists2table', кажется, ожидает список, но не намного больше информации, трудно быть уверенным. Код довольно запутанный и, похоже, имеет опечатки. – jonrsharpe

+0

вы также можете выполнять итерацию по файловому объекту, вам не нужно читать все в памяти, если вы не должны. –

+0

Спасибо, Джон. «.readlines()» сделал трюк. Не совсем уверен, как это искоренить. –

ответ

0

Эта линия прямо здесь:

with open(filename, 'r') as file: 
     return lists2table(file, mycaption) 

file в данном случае это объект файла, а не содержимое. Чтобы получить текст, вам нужно сделать file.read()

0

Посмотрите на свой код, как представляется, вы хотите создать таблицу с записями из файла. Теперь вы передаете объект файла своей функции lists2table, а затем пытаетесь индексировать его в виде списка, поэтому вы получаете этот error.You может попытаться использовать любого из следующих соображений

def file2table(filename, mycaption=None): 

    with open(filename, 'r') as file: 
     return lists2table(file.readlines(), mycaption) 

readlines() возвращает список строк в файле. Или вы можете передать объект файла в функции

def lists2table(mylists, mycaption=None): 

    result = '<table>\n' 
    mylists = mylists.read().split('\n')#this creates the desired list 
    if mycaption != None: 
     result += '<caption>' + mycaption + '</caption>\n' 
    result += list2THrow(mylists[0]) + '\n' 
    for item in mylists[1:]: 
     result += list2TDrow(item) + '\n' 
    result += '</table>' 
    return result