用python替换csv中列中的空值

时间:2013-04-29 16:06:54

标签: python csv replace

我正在尝试使用Python将某个列(例如第6列“作者”)中的空白值替换为“DMD”。我对这个程序还很陌生,所以很多术语都引发了我的注意。我已经阅读了CSV Python文档,但似乎没有任何特定于我的问题。这是我到目前为止所拥有的。它没有运行。我得到错误'dict'对象没有属性替换。似乎在dict中应该有类似的替换。此外,我不完全确定我搜索该字段的方法是准确的。任何指导都将不胜感激。

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)

3 个答案:

答案 0 :(得分:1)

我觉得你很亲密。您需要将字段名称传递给writer,然后您可以直接编辑row,因为它只是一个字典。例如:

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。]

答案 1 :(得分: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)

答案 2 :(得分:0)

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

(2)Dicts没有替换方法; dicts不是字符串。如果您正在尝试更改字符串,该字符串是dict条目的值,则需要按键引用该dict条目,例如row['Author']。如果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

干杯