0

私のコードは、私の .csv の最初の列だけを保存します。

def del_col(in_path):
     # read file into memory
        file_obj = open(in_path, 'rb')
        reader = csv.reader(file_obj, delimiter='\t')
        data = []
        for row in reader:
            column = str.split(row[0],',')
            data.append(column[0])
        print row

        file_obj.close()

        conf = raw_input('Delete Status Column? (Y|N): ').upper()[0]

        if conf == 'Y':
            # write data to file
            file_obj = open(in_path, 'wb')
            writer = csv.writer(file_obj)
            writer.writerows(data)
            file_obj.close()

変更が必要な部分として、コードの一番下のセクションを書いているのではないかと思います。私の単語を切り刻むのではなく、1 つのセルに保持するコマンドに関するアイデアはありますか? 助けてくれてありがとう。

4

2 に答える 2

1

writerowsシーケンスのリストが必要です。シーケンスごとに、シーケンス内の各エントリを異なる列に書き込みます。文字列のリストを与えています。必要な動作を取得するには、文字列のリストのリストを与える必要があります。またはタプル、どちらでも。

正しい動作を得るためのコードへの最小の変更は次のとおりです。

data.append(column[:1])

他にも変更したいことがたくさんありますが、それでうまくいくはずです。

data他に何を変更するかについては、リストを書き出す前にリストの内容をロードする必要はありません。csv.writer代わりに、正しいコンテンツを生成する反復子をクラスに渡すことができます。ここで、入力ファイルをその場で書き換えていることがわかります-私は通常、一時ファイルに書き込み、成功したらディスクに移動するか、別の名前で出力ファイルを探すことを好みます。

さらに、この例では、1 つの列しか書き込んでいないため、csv ライターは実際には必要ありません。単純なファイル ハンドルも同様に機能します。コンテキストから、このサンプルは完全ではなく、入力に基づいて、入力行の一部を削除したくない場合があると想定しています。ただし、「Y」ではない入力値に対して何を出力したいのかわかりません。

strインポートが存在しないため、 で何を呼び出しているのか完全にはわかりませんが、str.split組み込みstringモジュールの関数である場合、ほとんどが廃止されています。代わりに、split文字列オブジェクトのメソッドになりました。

私はそれを次のようにします:

def del_col(in_path):
    conf = raw_input('Delete Status Column? (Y|N): ').upper()[0]
    out_path = in_path + '.out'
    with open(in_path, 'rb') as input_file, open(out_path, 'wb') as output_file:
        reader = csv.reader(input_file, delimiter='\t')
        if conf == 'Y':
            # no need for a csv writer when writing just a single string per line
            output_file.writelines(row[0].split(',')[0] + '\n' for row in reader)
        else:
            # not sure what you want here; possibly a writer object?
            # actual logic to write the output file goes here in place of the pass
            pass
    os.rename(in_path, in_path + '.input')
    os.rename(out_path, in_path)
于 2013-10-11T22:34:35.707 に答える