2017-11-07 8 views
1

これで、csvファイルを読んでいるときに変更することは通常不可能なので、新しいcsvファイルを作成して書き込む必要があります。私が持っている問題は、データの元の順序を保持することです。Python- csvファイルを変更する

次のように入力csvファイルを検索します:

C1  C2   C3 
apple BANANA  Mango 
pear  PineApple StRaWbeRRy 

私は下ケースと出力にのように見える新しいCSVファイルのすべてのデータを有効にする:これまでのところ私ができる

C1  C2   C3 
apple banana  mango 
pear  pineapple strawberry 

を入力csvファイルを反復処理し、すべての値を小文字に変換しますが、その形式でcsvファイルに書き戻す方法はわかりません。私が持っているコードは次のとおりです。

def clean (input) 
    aList = [] 
    file = open(input, "r") 
    reader = csv.reader(file, delimiter = ',') 
    next(reader, None) # Skip the header but I want to preserve it in the output csv file 
    for row in reader: 
    for col in row: 
     aList.append(col.lower()) 

だから今、私は戻って、入力と同じ形式(行と列の数が同じ)のCSVファイルにそれを書き換えないか、すべて小文字のデータとのリストを持っています私がコードでスキップしたヘッダー行を含めて。

+0

リストに行を保存する気にしないでくださいを使用して保存することができlower()

import pandas as pd def conversion(text): return text.lower() df = pd.read_csv(file_path) df[column_name] = df[column_name].map(conversion) 

を使用することができます。入力と出力の両方のファイルを同時に開くだけですので、作成したそれぞれの変更された行を書き込むことができます。実際には、私はこのために 'csv'モジュールを使用しても気にしませんでした。ヘッダ行の大文字と小文字を保存する必要があるのは残念です。そうしないと、 'tr'プログラムでファイル全体を処理できます(UnixライクなOSを使っている場合)。 –

+0

pandas: 'pd.read_csv(input).apply(str.lower).to_csv(input)' –

+0

あなたのコードでは区切り文字として '、'が指定されていますが、サンプルデータは空白を使用しています。説明してください! –

答えて

2

あなたがしたいすべてが他のすべてのデータの場合を変更し、保存されている場合は、csvモジュールをスキップしてちょうど ストレートファイルなどを使用するのが最適かもしれません:あなたがしたい場合は

# Open both files 
with open("infile.csv") as f_in, open("outfile.csv", 'w') as f_out: 
    # Write header unchanged 
    header = f_in.readline() 
    f_out.write(header) 

    # Transform the rest of the lines 
    for line in f_in: 
     f_out.write(line.lower()) 
0

をすべてのcsvモジュールを使用し、次のコードスニペットを使用します。

import os 
import csv 


def clean(input): 
    tmpFile = "tmp.csv" 
    with open(input, "r") as file, open(tmpFile, "w") as outFile: 
     reader = csv.reader(file, delimiter=',') 
     writer = csv.writer(outFile, delimiter=',') 
     header = next(reader) 
     writer.writerow(header) 
     for row in reader: 
      colValues = [] 
      for col in row: 
       colValues.append(col.lower()) 
      writer.writerow(colValues) 
    os.rename(tmpFile, input) 
+0

これは間違いなく、別のファイルを作成して最後にファイルをコピーする必要があります。 –

+0

空白のインデントを修正する必要があります。異なる点で1,2,3,4のスペースを使用しています。 Pythonはこれを好まないでしょう! – Tim

+0

@Tim私は問題があるideoneを使用しています。 PyCharmを使ってこれを修正しました。 –

0

上記のコードはすべて小文字

+0

コードを変更しました。今すぐチェックしてください – Kalyan

+0

これは正常に動作します。しかし、以前のバージョンと同様に、ファイル全体を不必要に文字列に読み込みます。さらに、Timが言及するように、より多くのRAMを使用して文字列の連結を行います。しかし、私は、ファイルが巨大でなければ大丈夫だと思うし、一度にファイル全体の大文字小文字を一行ずつ変更するのは、行ごとに行うよりも効率的です。 –

+1

文字列の連結を避けることをお勧めします。これが大きなファイルの場合は、ファイル全体に十分なメモリを割り当ててから、ヘッダーを連結するために2回目に割り当てる必要があります。 – Tim

1

パンダで新しいCSVを作成します。初期CSVファイル名がtest.csv

with open('test.csv','r') as f: 
    with open('cleaned.csv','w') as ff: 
     ff.write(f.readline()) 
     ff.write(f.read().lower()) 

なりましょう 次のように私が見つけた最も簡単な方法ですway:

を使用してファイルを読むとデータフレームを取得します。そして、あなたは単に、あなたがto_csv機能

関連する問題