Карта над CSV в Python - PullRequest
       18

Карта над CSV в Python

0 голосов
/ 17 февраля 2011

Я пытаюсь использовать "карту" в CSV-файле в Python.

Однако строка map(lambda x: x, reseller_csv) ничего не дает.

Я пробовал перебирать объект csv, он отлично работает и может печатать строки.

Вот код.

# imports
import csv

# Opens files
ifile = open('C:\Users\josh.SCL\Desktop\Records.csv', 'r')
ofile = open('C:\Users\josh.SCL\Desktop\RecordsNew.csv', 'w')
resellers_file = open('C:\Users\josh.SCL\Desktop\Reseller.csv', 'r')


# Setup CSV objects
csvfile = csv.DictReader(ifile, delimiter=',')
reseller_csv = csv.DictReader(resellers_file, delimiter=',')

# Get names only in resellers
resellers = map(lambda x: x.get('Reseller'), reseller_csv)

Ответы [ 3 ]

4 голосов
/ 17 февраля 2011

csv.DictReader - это гаджет однократного использования.Вы, вероятно, запускали его второй раз.

>>> import csv
>>> iterable = ['Reseller,cost', 'fred,100', 'joe,99']
>>> reseller_csv = csv.DictReader(iterable)
>>> map(lambda x: x.get('Reseller'), reseller_csv)
['fred', 'joe']
>>> map(lambda x: x.get('Reseller'), reseller_csv)
[]
>>>

Пока мы здесь:

(1) [Python 2.x] Всегда открывайте CSV-файлы в BINARY mode.
[Python 3.x] Всегда открывайте файлы CSV в текстовом режиме (по умолчанию) и используйте newline=''

(2) Если вы настаиваете на жестком кодировании путей к файлам в Windows, используйте r.... "вместо" ... "или используйте косую черту - иначе \n и \t будут интерпретироваться как управляющие символы.

0 голосов
/ 17 февраля 2011

Сначала по вашей конкретной проблеме: попробуйте проверить, есть ли на самом деле ключ с именем 'Reseller', есть вероятность, что он там с другой заглавной буквой или дополнительным пробелом. Посмотреть список всех ключей (при условии, что DictReader не исчерпан):

>>> csvfile.next().keys()

В противном случае map() должно работать нормально. Но я бы сказал, что это более читабельно (и быстрее!) Сделано так:

resellers = [x['Reseller'] for x in reseller_csv]
0 голосов
/ 17 февраля 2011

У меня работает следующее:

>>> data = ["name,age", "john,32", "bob,45"]
>>> list(map(lambda x: x.get("name"), csv.DictReader(data))) # Python 3 so using list to see values.
['john', 'bob']

Вы уверены, что вообще получили какие-либо данные от вашего DictReader?Читаете ли вы какие-либо данные из этого до этого, возможно, утомительно читателя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...