2013-04-29 119 views
0

我想用Python中的「DMD」替換CSV中的某個列中的空白值(例如,第6列「作者」)。我對這個計劃相當陌生,所以有很多的術語會拋出我。我已經閱讀了CSV Python文檔,但似乎沒有任何特定於我的問題的東西。這是我到目前爲止。它不運行。我得到的錯誤'字典'對象沒有屬性替換。似乎在字典中應該有類似的替換。另外,我不完全確定我的搜索方法是準確的。任何指導將不勝感激。因爲簡單的賦值爲您完成此使用python替換csv中的列中的空白值

import csv 
inputFileName = "C:\Author.csv" 
outputFileName = os.path.splitext(inputFileName)[0] + "_edited.csv" 

field = ['Author'] 

with open(inputFileName) as infile, open(outputFileName, "w") as outfile: 
    r = csv.DictReader(infile) 
    w = csv.DictWriter(outfile, field) 
    w.writeheader() 
    for row in r: 
     row.replace(" ","DMD") 
     w.writerow(row) 

回答

0

字典不需要replace方法:

for row in r: 
    if row[header-6] == "": 
     row[header-6] = "DMD" 
    w.writerow(row) 

哪裏header-6是你的第六列的名稱

另外請注意,您的來電DictReader似乎有錯誤的fields屬性。該參數應該是包含全部新CSV的標題的列表(或其他順序),按順序排列。

你的目的,這似乎是簡單的使用香草讀者:

import csv 
inputFileName = "C:\Author.csv" 
outputFileName = os.path.splitext(inputFileName)[0] + "_edited.csv" 

with open(inputFileName) as infile, open(outputFileName, "w") as outfile: 
    r = csv.reader(infile) 
    w = csv.writer(outfile) 
    w.writerow(next(r)) # Writes the header unchanged 
    for row in r: 
     if row[5] == "": 
      row[5] = "DMD" 
     w.writerow(row) 
1

我覺得你非常接近。您需要將字段名傳遞給writer,然後您可以直接編輯0​​,因爲它只是一個字典。例如:

with open(inputFileName, "rb") as infile, open(outputFileName, "wb") as outfile: 
    r = csv.DictReader(infile) 
    w = csv.DictWriter(outfile, r.fieldnames) 
    w.writeheader() 
    for row in r: 
     if not row["Author"].strip(): 
      row["Author"] = "DMD" 
     w.writerow(row) 

變成

a,b,c,d,e,Author,g,h 
1,2,3,4,5,Smith,6,7 
8,9,10,11,12,Jones,13,14 
13,14,15,16,17,,18,19 

a,b,c,d,e,Author,g,h 
1,2,3,4,5,Smith,6,7 
8,9,10,11,12,Jones,13,14 
13,14,15,16,17,DMD,18,19 

我喜歡用if not somestring.strip():因爲如果沒有空間,這樣也沒什麼關係,或者一個或十七歲一個標籤。我也喜歡DictReader,因爲這樣你就不必記住哪一列Author是住在標準的讀者

。[PS:以上假設的Python 2,不3.]

+0

感謝帝斯曼。這真是奇妙! – 2013-04-29 19:33:47

0

(1)使用os.path.splitest,你需要添加一個import os

(2)字典沒有替換方法;字典不是字符串。如果你想修改一個字典,它是字典條目的值,你需要通過鍵引用該字典條目,例如, row['Author']。如果行['作者']是一個字符串(應該是你的情況),你可以做一個替換。聽起來你需要Python字典的介紹,例如參見http://www.sthurlow.com/python/lesson06/

(3)要做到這一點的一種方式,這也與多個空間的交易,沒有空格等領域,應該是這樣的:

field = 'Author' 
marker = 'DMD' 
.... 

## longhand version 
candidate = str(row[field]).strip() 
if candidate: 
    row[field] = candidate 
else: 
    row[field] = marker 

## shorthand version 
row[field] = str(row[field]).strip() and str(row[field]) or marker 

乾杯

+1

我認爲在這裏使用'和/或'要比使用三元組清晰得多,即如果不是行[field] .strip()else row [field]'或其他東西,'row [field] = marker。而'str'是無意義的。 – DSM 2013-04-29 16:54:09