0

Python を使用して、特定の列 (列 6 '作成者' など) の空白の値を CSV の "DMD" に置き換えようとしています。私はこのプログラムにかなり慣れていないので、多くの専門用語に戸惑います。CSV Python ドキュメントを読みましたが、私の質問に固有のものはないようです。これが私がこれまでに持っているものです。動かない。エラー 'dict' object has no attribute replace が表示されます。辞書で置き換えるのに似たものが必要なようです。また、フィールドを検索する方法が正確かどうかは完全にはわかりません。任意のガイダンスをいただければ幸いです。

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)
4

4 に答える 4

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():スペースがなくても、スペースが 1 つでも、17 とタブが 1 つでもかまいません。また、標準のリーダーの方が好きです。この方法では、どの列に住んでいるDictReaderかを覚えておく必要がないからです。Author

[PS: 上記は Python 3 ではなく Python 2 を想定しています。]

于 2013-04-29T16:28:43.547 に答える
0

(1) os.path.splitest を使用するには、import os

(2) dict には replace メソッドがありません。辞書は文字列ではありません。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

乾杯

于 2013-04-29T16:41:39.697 に答える
0

単純な割り当てがこれを行うため、辞書はreplaceメソッドを必要としません。

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

header-6あなたの 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)
于 2013-04-29T16:11:04.643 に答える