我正在尝试使用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)
答案 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
干杯