2012-01-18 3 views
4

Я работаю с растровой средой для веб-сайтов Scrapy, и я немного нуб, когда дело доходит до python. Поэтому мне интересно, как я перебираю все скребковые предметы, которые, кажется, находятся в словаре, и отделяем пустое пространство от каждого.Итерация по словарю в python и удаление пробела

Вот код, который я играл в моем трубопроводе пункта .:

for info in item: 
    info[info].lstrip() 

Но этот код не работает, потому что я не могу выбрать элементы по отдельности. Так что я пытался сделать это:

for key, value item.items(): 
    value[1].lstrip() 

Этот второй метод работает в определенной степени, но проблема в том, что я понятия не имею, как потом цикла по всем значениям.

Я знаю, что это, вероятно, такое легкое решение, но я не могу найти его. Любая помощь будет принята с благодарностью. :)

+0

Предлагаю вам ознакомиться с http://doc.scrapy.org/en/latest/topics/loaders.html. Здесь можно позаботиться о многих очистках. – zsquare

+0

Добавили ответ с примером – zsquare

ответ

1

не прямой ответ на этот вопрос, но я хотел бы предложить вам посмотреть на Item Loaders и ввода/вывода процессоров. Здесь вы можете позаботиться о своей уборке.

Пример, который раздевает каждая запись будет:

class ItemLoader(ItemLoader): 

    default_output_processor = MapCompose(unicode.strip) 
+0

ваш ответ именно то, что я искал! Спасибо большое. хотя это не совсем то, что я спросил .. это то, что мне нужно, это работало отлично. так что спасибо! –

+0

Нет проблем вообще :) – zsquare

1

Попробуйте

for k,v in item.items(): 
    item[k] = v.replace(' ', '') 

или комплексно, как предложено monkut:

newDic = {k,v.replace(' ','') for k,v in item.items()} 
+0

спасибо вам за помощь. У меня есть один вопрос, есть ли какой-то трюк функции .replace(), потому что, когда я пытаюсь использовать его, python выплевывает ошибку, поскольку элемент списка не имеет atrabute replace(). есть что-то, что мне нужно включить? –

+0

@ AlexW.H.B .: Хорошая точка! Поэтому лучше использовать regExp, например, 'import re', а затем' re.sub (r '\ s', '', stringWithWhiteSpaces) ' – ezdazuzena

2

Что следует отметить, что lstrip() возвращает копию строки, а не изменять объект. Чтобы на самом деле обновить словарь, вам необходимо присвоить снятое значение этому элементу.

Например:

for k, v in your_dict.iteritems(): 
    your_dict[k] = v.lstrip() 

Обратите внимание на использование .iteritems(), который возвращает итератор вместо списка ключевых пар значений. Это делает его несколько более эффективным.

Я должен добавить, что in Python3, .item() has been changed to return "views" и поэтому .iteritems() не требуется.

+0

Я ошибаюсь или снимаю только удаленные лидирующие и завершающие символы? – ezdazuzena

+0

@ezdazuzena Что он делает. Я просто придерживаюсь примера OP и предполагаю, что это то, чего он пытается достичь. Ключевое сообщение здесь состоит в том, что строка с разделенным/замененным должна быть назначена обратно. –

+0

.. в любом случае, вы правы. Хотя мне больше нравится решение по пониманию monkut;) – ezdazuzena

14

В словаре понимания (доступен в Python> = 2.7):

clean_d = { k:v.strip() for k, v in d.iteritems()} 
+1

Nice. Обратите внимание, что понимание dict доступно только в Python> = 2.7. –

+0

Шон, спасибо, я забыл упомянуть ограничение версии. Я добавил комментарий. – monkut

0

Хотя @zquare был лучший ответ на этот вопрос, я чувствую, что мне нужно звонить в с методом вещий, который также будет приходиться для значений словаря, не являются строками. Это не рекурсивный взгляд на вас, поскольку он работает только с одномерными объектами словаря.

d.update({k: v.lstrip() for k, v in d.items() if isinstance(v, str) and v.startswith(' ')}) 

Это обновляет исходное значение словаря, если значение является строкой и начинается с пробела.

UPDATE: Если вы хотите использовать регулярные выражения и избегать использования начальных и конечных элементов.Вы можете использовать это:

import re 
rex = re.compile(r'^\s|\s$') 
d.update({k: v.strip() for k, v in d.items() if isinstance(v, str) and rex.search(v)}) 

Эта версия переносится, если значение имеет символ ведущего или заднего пробела.

0

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

# strip any type of object 
def strip_all(x): 
    if isinstance(x, str): 
    x = x.strip() 
    elif isinstance(x, list): 
    x = [ strip_all(v) for v in x ] 
    elif isinstance(x, dict): 
    for k, v in x.iteritems(): 
     x.pop(k) # also strip keys 
     x[ strip_all(k) ] = strip_all(v) 
    return x 
Смежные вопросы