2016-05-20 13 views
0

私はこのコードを使用してExcelをCSVファイルに変換していますが、一部のフィールドには二重引用符で囲まれたテキストがあり、変換を行うと二重引用符空白。 どうすればこの問題を回避できますか。Python xlsx to csv

import xlrd 
import unicodecsv 
import sys 

def xls_to_csv (xls_filename, csv_filename): 

    wb = xlrd.open_workbook(xls_filename) 
    sh = wb.sheet_by_index(0) 

    fh = open(csv_filename,"wb") 
    csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') 

    for row_number in range (1,sh.nrows): 
     csv_out.writerow(sh.row_values(row_number)) 

    fh.close() 
xls_to_csv(sys.argv[1],sys.argv[2]) 

Excelファイル:

Excel file

実際の出力:

enter image description here

私の目標は、追加の二重引用符なしでCSVです。

答えて

0

「追加」引用符データそれ自体ではありません。最も外側の引用符(両端に)は単なる文字列区切り文字です。これらの区切り文字は、実際のデータに引用符が含まれている場合、CSVのExcelの方言では、が必須です。文字列区切り文字の中では、実際の引用符を二重にすることによって "エスケープ"する必要があります。

custom dialect of CSVは、Excelで使用されないように書いているようですが、それは聞こえません。だから、あなたはそれに応じてパラメータを調整する必要があります。

csv_out = unicodecsv.writer(
    fh, 
    encoding='utf-8', 
    delimiter=';', 
    quoting=unicodecsv.QUOTE_NONE, 
    quotechar=None) 

これらの設定は、既存のデータ引用符を維持するが、任意の区切り引用符を追加することなくなります。 (つまり、上記の設定はとなるでしょう。となります。は区切り記号です。です。)残りのコードはまったく同じになります。

詳細については、Python 2's CSV docsをよく読んでください。 。。(私はあなたがunicodecsvを使用しているので、あなたは、Python 2を使用していると仮定できるだけcsvモジュールのインターフェイスを模倣するように設計されて実際には、それを使用するために推奨される方法は、このようにそれをインポートすることです:

import unicodecsv as csv 

あなたが可能encodingパラメータを除いて、Pythonの独自のcsvを使用しているかのようにあなたのコードの残りの部分は正確に見えるようにします。ご希望のエンコーディングがUTF-8であればところで、あなたはそのパラメータをオフのままにすることができます。)

1

あなたは次のようにそれらを書き込む前に、各セルから既存の引用符を取り除くことができます:

def xls_to_csv(xls_filename, csv_filename): 
    wb = xlrd.open_workbook(xls_filename) 
    sh = wb.sheet_by_index(0) 

    with open(csv_filename,"wb") as fh: 
     csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') 

     for row_number in range (1, sh.nrows): 
      row = [] 
      for col in sh.row_values(row_number): 
       try: 
        row.append(col.strip('"')) 
       except AttributeError: 
        row.append(col) 

      csv_out.writerow(row) 

xls_to_csv(sys.argv[1],sys.argv[2]) 
0

あなたが1つの関数にそれをしたい場合:

import xlrd 
import unicodecsv 
import sys 

def xls_to_csv (xls_filename, csv_filename): 

    wb = xlrd.open_workbook(xls_filename) 
    sh = wb.sheet_by_index(0) 

    fh = open(csv_filename,"wb") 
    csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') 

    for row_number in range (1,sh.nrows): 
     row = [] 
     row = [s.replace('"', '') for s in sh.row_values(row_number)] 
     csv_out.writerow(row) 

    fh.close() 
xls_to_csv(sys.argv[1],sys.argv[2])