用python替换csv列中的空值

2024-05-09 03:22:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python在CSV中将某一列(例如第6列的Author)中的空白值替换为“DMD”。我对这个程序还不太熟悉,所以很多行话都让我觉得很奇怪。我已经阅读了CSV-Python文档,但似乎没有什么是我的问题所特有的。这是我目前所拥有的。它不会跑。我得到错误'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)

Tags: csvfieldasopen中将空白infileoutfile
3条回答

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

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

干杯

字典不需要replace方法,因为简单赋值为您实现了这一点:

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

其中header-6是第六列的名称

还要注意,您对DictReader的调用似乎具有错误的fields属性。该参数应该是一个列表(或其他序列),按顺序包含新CSV的头。

就您的目的而言,使用vanilla reader似乎更简单:

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)

我觉得你很接近。您需要将字段名传递给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所在的列。

[注:以上假设Python 2,而不是3。]

相关问题 更多 >

    热门问题