2016-06-22 22 views
3

私はPythonに読み込み、操作して別のCSVファイルに書き込もうとしているcsvファイルを持っています。区切り記号として区切り記号の前または後にカンマ区切りでカンマを区切る方法

私の現在の問題は、ファイルがカンマで区切られているにもかかわらず、すべてのカンマがデリミタではないことです。

NOTの前および/または後にカンマだけが区切り文字としてカウントされる必要があります。 (「のみ」、「not」、「or」、「」)。ここで

は私のコードは次のように見える方法は次のとおりです。

import csv 

#open file for reading 
with open(mypath, 'r', encoding = 'utf_8') as csvfile: 
    myfile = list(csv.reader(csvfile, dialect = 'excel', delimiter = ',')) 
    #specifying columns to be deleted 
    BadCols = [29,28,27,25,21,20,19,18,16,15,14,13,12,11,8,7,4,3] 
    #Loop through column indices to be deleted 
    for col in BadCols:   
     #Loop through each row to delete columns 
     for i, row in enumerate(myfile): 
      #Delete Column, which is basically a list item at that row 
      myfile[i].pop(col) 


#Open file for writing 
with open(mypath2, "w", encoding = 'utf_8', newline='') as csvfile: 
    csv_file = csv.writer(csvfile, dialect = 'excel', delimiter = ',') 
    for i, row in enumerate(myfile): 
     for j, col in enumerate(row): 
      csvfile.write('%s, ' %col) 
     csvfile.write('\n') 
csvfile.close 

ここに私のデータがどのように見えるかです:

Date,Name,City 
May 30, 2016,Ryan,Boston 

は、ここで私は、私はExcelを使用してファイルを開いたときに見てみたいものだ。

Date   Name City 
May 30, 2016 Ryan Boston 

実際に私がExcelから実際に見ているもの:

Date  [Blank column name] Name City 
May 30 2016     Ryan Boston 

したがって、日付は1つではなく2つの要素として読み取られます。

ご協力いただければ幸いです。

+2

CSVとフィールドセパレータは "引用"なしのコンテンツとしても使用されています - shiver、私は速いハックとして、最初にすべての "良い" separtorsを帯域外の文字(pipe(|))それ以外のファイルに表示されている場合は、そのファイルを分割するか、csvモジュールで特殊な方言または自動検出を解析するようにしてください。しかし、ここの夕方では遅すぎるかもしれません;-)、または、右の場合は、常に2つのコンマが、単純な 'line.rsplit( '、'、2)'などで右側から解析されます。 @ padraic-cunninghamの回答 – Dilettant

+1

あなたが持っているものは**適切なCSVファイルではありません**。ファイルを修正してください... – Bakuriu

答えて

2

正規表現は、あなたの最善の策かもしれ:

あなたを与えるだろう
import re 

patt = re.compile(r"\b,\b") 
with open("in.csv") as f: 
    for row in map(patt.split, f): 
     print(row) 

['Date', 'Name', 'City\n'] 
['May 30, 2016', 'Ryan', 'Boston'] 

あなたは末尾の空白の世話をする必要がありますが、それは大きな問題ではありません。明らかに、もしあなたが名前として"foo,bar"を持っていたら、問題にぶつかるだろうが、もしそうでなければ再アプローチはうまくいくだろう。

別のオプションは、多分ちょうどスペースで", "または" ,"を交換するには、次のようになります。

import csv 
import re 

patt = re.compile(r"\s(,)|(,)\s") 

with open("in.csv") as f: 
    for line in csv.reader(map(lambda s: patt.sub(" ", s), f)): 
     print(line) 

そうするために:

Date,Name,City 
May 30, 2016,Ryan,Boston 
May 31 ,2016,foo,Narnia 

あなたが得るでしょう:人のために

['Date', 'Name', 'City'] 
['May 30 2016', 'Ryan', 'Boston'] 
['May 31 2016', 'foo', 'Narnia'] 
+0

素晴らしい提案、パドレイク。ありがとう! – Othman

0

を同じ問題に直面している場合は、Pandasライブラリ、特にPadraicの提案された解決策があなたのために機能しない場合。それは非常に使いやすいです。

関連する問題