2011-02-16 61 views
0

我想在python的csv文件上使用「映射」。在python上映射csv

但是,行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) 
+1

可能想顯示你對如何創建`reseller_csv`代碼,即使我以爲這是某種形式的CSV讀者對象從` csv`模塊 – 2011-02-16 23:16:42

回答

4

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的在BINARY模式始終打開CSV文件。
[Python 3.x都有在文本模式(默認)始終打開CSV文件,並使用newline=''

(2)如果你堅持在Windows中,使用r硬編碼文件路徑「......」代替「...」,或者使用正斜槓 - 否則\n\t將被解釋爲控制字符。

0

對我來說,以下工作:

>>> 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獲得任何數據?你是否在此之前從它讀取任何數據,可能耗盡讀者?

0

首先針對您的具體問題:嘗試檢查是否確實存在一個名爲'Reseller'的關鍵字,可能會出現不同的大小寫或額外空間。查看所有按鍵的列表(假定非耗盡DictReader):

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

否則map()應該正常工作。但我認爲這是更具可讀性這樣做(和更快!):

resellers = [x['Reseller'] for x in reseller_csv] 
+0

OP的代碼使用`x.get('Reseller')`,如果指定的鍵不存在,則返回`None` ...所以他會得到`[None,None,...] 。此外,他說`map(lambda x:x,reseller_csv)`返回「nothing」(推測是`[]`),而在你錯誤的關鍵假設下,結果將會是一個dicts列表。 – 2011-02-17 03:21:28