2014-08-31 37 views
-2

我希望我的問題有道理。我正在尋找一種方法來讀取一個csv文件,並將字典映射到每個單元格。我可以讓它在沒有csv的情況下工作,但是我在閱讀csv文件時很難使其工作。Python CSV - 爲每個單元格使用字典

注:

string0 would be cell A1 or row[0] 
string1 would be cell B1 or row[1] 
string2 would be cell C1 or row[2] 

這是我到目前爲止有:

dict0 = {'A':'CODE1', 'B':'CODE2'} 
text0 = [] 
string0 = 'A' 

dict1 = {'avenue':'ave', 'street':'st', 'road':'rd', 'court':'ct'} 
text1 = [] 
string1 = '123 MAIN AVENUE' 

dict2 = {'(':'', ')':'', '-':'', ' ':'', '/':'', '\\':''} 
text2 = [] 
string2 = '(123) 456/7890' 


for i in string0: 
    newcode = dict0.get(i,i) 
    text0.append(newcode) 
print ' '.join(text0) 


for i in string1.lower().split(' '): 
    newaddress = dict1.get(i.lower(),i) 
    text1.append(newaddress) 
print ' '.join(text1) 


for i in string2: 
    newphone = dict2.get(i,i) 
    text2.append(newphone) 
print ''.join(text2) 

上面的代碼工作完全按照我想讓它工作,但有一個困難時期試圖使它IM讀取csv文件時工作。

非常感謝你

編輯#1:********************************* **************

這裏是sample1.csv的摘錄:

A,123 MAIN STREET,(123) 456-7890 
B,888 TEST ROAD,(222) 555-5555 

對不起,如果代碼心不是更清潔/更清晰,但是這就是爲什麼我我在尋求指導。

從本質上講,每一列都會有一個與之關聯的字典,因此根據單元格A1的值(「A」或「B」),「代碼」列將寫入「CODE1或CODE2」。

第2列將與dict1 {}相關聯,並將清理地址列。 第3列將與dict2 {}相關聯,並將從電話號碼列中刪除(,),/,\。

我的問題是我不知道如何啓動代碼。我可以編寫代碼,如果我將單元格信息設置爲變量(請參閱上面的代碼,變量:string0,string1,string2),但我不知道如何開始迭代csv文件。

謝謝

編輯#2:*********************************** ************

這裏是我的代碼時,我嘗試使用import csv

dict0 = {'A':'CODE1', 'B':'CODE2'} 
text0 = [] 
dict1 = {'avenue':'ave', 'street':'st', 'road':'rd', 'court':'ct'} 
text1 = [] 
dict2 = {'(':'', ')':'', '-':'', ' ':'', '/':'', '\\':''} 
text2 = [] 

import csv 

with open('O:/sample1.csv', 'rb') as c: 
    reader = csv.reader(c) 

    for row in reader: 

     for i in row[0]: 
      newcode = dict0.get(i,i) 
      text0.append(newcode) 


     for i in row[1].lower().split(' '): 
      newaddress = dict1.get(i.lower(),i) 
      text1.append(newaddress) 


     for i in row[2]: 
      newphone = dict2.get(i,i) 
      text2.append(newphone) 


     print str(' '.join(text0)) + ',' + str(' '.join(text1)) + ',' + str(''.join(text2)) 

打印:

CODE1,123 main st,1234567890 
CODE1 CODE2,123 main st 888 test rd,12345678902225555555 

我會要打印:

CODE1,123 main st,1234567890 
CODE2,888 test rd,2225555555 

希望有人能幫助

謝謝

編輯#3 ********************* ************************************************** **************************************

可以進行如下改進(語法,縮進等):

sample1。CSV:

A,123 MAIN STREET,(123) 456-7890 
B,888 TEST ROAD,(222) 555-5555 

這裏是代碼:

import csv 

newcsv = csv.writer(open('O:/csvfile1.csv', 'ab')) 

with open('O:/sample1.csv', 'rb') as c: 
    reader = csv.reader(c) 

    dict0 = {'A':'CODE1', 'B':'CODE2'} 
    dict1 = {'avenue':'ave', 'street':'st', 'road':'rd', 'court':'ct'} 
    dict2 = {'(':'', ')':'', '-':'', ' ':'', '/':'', '\\':''} 

    # read element in *reader* 
    for row in reader: 
     text0 = [] 
     text1 = [] 
     text2 = [] 
     newline = [] 

     # read element in *row* 
     for i in row[0]: 
      newcode = dict0.get(i,i) 
      text0.append(newcode) 
     newline.append(' '.join(text0)) 

     for i in row[1].lower().split(' '): 
      newaddress = dict1.get(i.lower(),i) 
      text1.append(newaddress) 
     newline.append(' '.join(text1)) 

     for i in row[2]: 
      newphone = dict2.get(i,i) 
      text2.append(newphone) 
     newline.append(''.join(text2)) 


     newcsv.writerow(newline) 

     print newline 

打印以下:

['CODE1', '123 main st', '1234567890'] 
['CODE2', '888 test rd', '2225555555'] 

創建csvfile1.csv(使用 '|' 爲 '細胞定界符')和它的正是我想要的:

CODE1|123 main st|1234567890 
CODE2|888 test rd|2225555555 

just wonderin g如果上述代碼能夠以更有效的方式改進/書寫。

謝謝

+2

請問您可以添加'sample1.csv'的摘錄嗎?至少第一個幾行... – chuckus 2014-08-31 20:05:42

+0

它不清楚你有什麼代碼,至於它如何與每個單元格的字典創建有關。請詳細說明並顯示樣本輸入和輸出。 – martineau 2014-08-31 21:43:53

+0

好吧,我添加了sample1.csv的摘錄,並試圖進一步解釋我的問題。 – jes516 2014-08-31 22:43:30

回答

0

的原因亂碼輸出是,你不清除在循環的每個週期的text<n>變量。雖然下面有修正,我建議至少讀取how to define functions,重寫沒有這麼多全局變量的代碼,這樣就不會像現在一樣遇到同樣的問題。

with open('O:/sample1.csv', 'rb') as c: 
reader = csv.reader(c) 

for row in reader: 
    text0 = [] 
    text1 = [] 
    text2 = [] 
    for i in row[0]: 
     newcode = dict0.get(i,i) 
     text0.append(newcode) 


    for i in row[1].lower().split(' '): 
     newaddress = dict1.get(i.lower(),i) 
     text1.append(newaddress) 


    for i in row[2]: 
     newphone = dict2.get(i,i) 
     text2.append(newphone) 


    print str(' '.join(text0)) + ',' + str(' '.join(text1)) + ',' + str(''.join(text2)) 
+0

我添加了我的csv代碼。你可以檢討一下嗎? – jes516 2014-09-01 00:15:46

+0

你認爲我發佈的代碼(編輯#3)可以改進嗎?如果是的話,你可以提供一些指導方針/提示如何? – jes516 2014-09-01 17:39:05