2017-03-13 15 views
-5

私はpythonで新しいです。ここに私のCSVファイルがあります:Pythonでcsvセルに文字を挿入するには?

data;data;name surname; data; data 
data;data;name surname; data; data 
data;data;name surname; data; data 
data;data;name surname; data; data 

私がしたいことは、 ";"を挿入することです。そのような名前と名字2列作るために:

data;data;name;surname; data; data 
data;data;name;surname; data; data 
data;data;name;surname; data; data 
data;data;name;surname; data; data 

をしかし、ハードなことは時々そのような複数のスペースがあり、されています

data;data;name surname surname2; data 
data;data;name surname surname2 surname3; data 

は、私はちょうど最初の空白を交換したいです、いないすべてのことのように:

data;data;name;surname surname2; data 
data;data;name;surname surname2 surname3; data 

ここに私のコードですが、それはすべてのスペース置き換え:

def modify_rows(): 
    with open("result2.csv","rb") as source: 
      rdr= csv.reader(source, delimiter=';') 
      with open("result3.csv","wb") as result: 
      wtr= csv.writer(result,delimiter=';') 
       for r in rdr: 
        rowname = r[3].replace(' ', ';') 
        wtr.writerow((r[0],r[1],rowname,r[2]))  

希望が見つかりました。

+0

はあなたには、いくつかを与えることができます予想されるファイルサイズの列と行の向き私たちが大きなファイルについて話しているなら、答えは異なるかもしれません – Adirio

+0

Pythonライブラリの 're'モジュールを試してみよう – saikumarm

+0

私は最初のスペースが正規表現よりも簡単であることに同意しません。 – Adirio

答えて

1

とエラーの多くを得るためにバインドされているあなたがすることによって試合の与えられた数の後に停止するようにPythonのsplit()を伝えることができ、私を信頼maxsplitパラメータを渡します。

import csv 

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output, delimiter=';') 

    for row in csv.reader(f_input, delimiter=';'): 
     # Skip empty lines 
     if len(row) > 3: 
      try: 
       name, surname = row[2].split(' ', 1) 
      except ValueError as e: 
       # No surname 
       name, surname = row[2], '' 

      row[2] = name 
      row.insert(3, surname) 
      csv_output.writerow(row) 

ので、入力のために:

data;data;name surname1 surname2;data;data 
data;data;name surname;data;data 
data;data;name surname;data;data 
data;data;name surname;data;data 

あなたが得るでしょう:次のようにだからあなたの場合にはあなただけの最初のスペースの後に分割する必要があり

data;data;name;surname1 surname2;data;data 
data;data;name;surname;data;data 
data;data;name;surname;data;data 
data;data;name;surname;data;data 
+0

良い答え、ファイルが同じである必要がある場合は、最初にリストを読み込んでから同じファイルに書き込むことをお勧めします。大きなファイル(メモリの問題)のこの種のメソッド – Adirio

+0

あなたのすべてのあなたの助けをありがとう。私はsplit()を知らなかった。私はあなたの例のように使用しましたが、エラー "ValueError:解凍するには1つ以上の値が必要です"があります。何が間違っているのか分かりません。 – ThonPy

+0

csvファイルに空行があるか、名前は 'しかし、'姓 'はありません。 –

0
>>> name_surname_regex = re.compile('^([^;]*;[^;]*;)([^\s]*\s[^\s]*)(.*)$') 
>>> match_obj = name_surname_regex.match(data[1]) 
>>> for list_d in data: 
     match_obj = name_surname_regex.match(list_d) 
     print match_obj.group(1) + match_obj.group(2).replace(' ', ';') + match_obj.group(3) 

データは、あなたが与えられているものをフォローしていない場合、あなたは、コード

+0

複雑でちょうど部分的な答え以上 – Adirio

関連する問題