2013-03-20 2 views
-1

Я сейчас делаю проект для класса, и мне нужен небольшой совет/помощь. У меня есть файл csv, из которого я извлекаю данные. (Я не использую модуль csv, потому что я не знаком с ним, и инструктор предупредил нас, что это сложно.) Я получил данные в списки, используя созданную мной функцию. Он отлично работает, если значения представляют собой просто строку чисел, но если в ячейке есть знак процента или «N/A», я получаю сообщение об ошибке. Вот код:Как удалить специальные символы из списка в python?

def get_values(file, index): 

    '''(file object, int) -> list 
    Return a list of states and corresponding values at a prticular index in file.''' 

    values_list = [] 
    for i in range(6): 
     file.readline() 
    for line in file: 
     line_list = line.split(',') 
     values_list.append(line_list[index]) 
    values_list = [i.rstrip('%') for i in values_list] 
    values_list = [float(i) for i in values_list] 
    return values_list 




while True: 
    try: 
     file_name = input('Enter in file name: ') 
     input_file = open(file_name, 'r') 
     break 

    except IOError: 
     print('File not found.') 




heart_list = get_values(input_file, 1) 

input_file.close() 
input_file = input_file = open('riskfactors.csv', 'r') 


HIV_list = get_values(input_file, 8) 

input_file.close() 

Я хотел бы лишить%, но ничего я, в синтаксического дерева работает до сих пор. Какие-либо предложения?

+0

csv не является сложным, это, вероятно, облегчит вам жизнь – jamylak

ответ

1

Не видя полный SSCCE с входами образца, что трудно быть уверенным, но я готов поспорить, проблема заключается в следующем:

values_list = [i.rstrip('%') for i in values_list] 

Это лишит любые '%' символы с конца каждого значения , но он не будет лишать никаких '%' символов в другом месте. И в типичном файле CSV это недостаточно.

Я предполагаю, что у вас есть линии, как это:

foo , 10% , bar 

Это будет разбиты на:

['foo ', ' 10% ', ' bar\n'] 

Итак, вы добавляете ' 10% ' к values_list и rstrip линии не будет делать ничего , потому что он не заканчивается '%', он заканчивается ' '.

Или, наоборот, это может быть просто так:

foo,bar,10% 

Таким образом, вы получите это:

['foo', 'bar', '10%\n'] 

... который имеет такую ​​же проблему.

Если это (или версия) является проблемой, что вы хотите сделать что-то вроде:

values_list = [i.strip().rstrip('%')` for i in values_list] 

Между тем, вы можете сделать это намного проще, просто избавившись от списка понимания. Зачем пытаться исправить каждую строку после факта, когда вы можете исправить одиночные значения по мере их добавления? Например:

for line in file: 
    line_list = line.split(',') 
    value = line_list[index] 
    value = value.rstrip('%') 
    value = float(value) 
    values_list.append(value) 
return values_list 

И теперь все достаточно просто, что вы можете объединить несколько строк, не делая их менее читаемыми.


Конечно, вам все еще нужно иметь дело с 'N/A'. Вопрос заключается в том, хотите ли вы рассматривать это как 0.0 или None или пропустить его или сделать что-то другое, но независимо от того, что вы решите, вы можете использовать try вокруг float вместо проверки на 'N/A', чтобы сделать ваш код более надежным ,Например:

value = value.rstrip('%') 
try: 
    value = float(value) 
except ValueError as e: 
    # maybe log the error, or log the error only if not N/A, or... 
    pass # or values_list.append(0.0), or whatever 
else: 
    values_list.append(value) 

Кстати, дело с такого рода вещи именно поэтому вы должны использовать csv модуль.

Вот как вы используете csv. Вместо этого:

for line in file: 
    line_list = line.split(',') 

Просто сделай это:

for line_list in csv.reader(file): 

Это сложно?

И он позаботится обо всех тонкостях с зачисткой пробелов (и цитированием и побегом и всеми прочими чужими ошибками, которые вы забудете протестировать).

Другими словами, скорее всего, если бы вы использовали csv, помимо сохранения одной строки кода, у вас не было бы этой проблемы в первую очередь - и то же самое было бы верно для 8 из следующих 10 проблемы, с которыми вы столкнетесь.

Но если вы учитесь у инструктора, который считает, что csv слишком сложный ... хорошо, хорошо, что вы достаточно мотивированы, чтобы попытаться понять вещи сами и задать вопросы вне класса, так что есть надежда ...

+0

Кто бы ни старался, помогите объяснить, почему? – abarnert

+0

Мне было интересно то же самое. Я думал, что это важный вопрос, и я работал над этим кодом снова и снова, прежде чем я попросил о помощи. – user2188956

+0

Этот проект, если для программирования класса 101, и я думаю, потому что учебник не перешел на модуль csv, который преподаватель почувствовал, что это будет слишком много, если нам нужно будет самостоятельно изучить модуль csv. Еще раз спасибо @abarnert за то, что вы дали мне такой подробный ответ, и я вижу, что csv проще в использовании, чем то, что я пытаюсь сделать. – user2188956

Смежные вопросы