2016-05-20 11 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

В «дополнительные» котировки не данные как таковые. Самые отдаленные цитаты (один на каждом конце) являются просто разделителями строк. Эти разделители являются обязательными на диалекте Excel CSV, когда фактические данные содержат кавычки, которые у вас есть. В ограничителях строк фактические кавычки должны быть «экранированы» путем их удвоения. (Первая неопределенная цитата будет интерпретирована как разделитель замыкающей строки.)

Похоже, вы пытаетесь написать 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. .. (Я предполагаю, что вы используете Python 2, потому что вы используете unicodecsv Он разработан, чтобы имитировать интерфейс csv модуля настолько близко, насколько это возможно в действительности, рекомендуемый способ использовать его, чтобы импортировать его, как это:

import unicodecsv as csv 

так, что остальная часть кода выглядит точно, как будто вы используете Python собственного csv, для возможного encoding параметра, за исключением. Кстати, вы можете оставить от этого параметра, если нужная кодировка 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

В случае, если вы хотите сделать это в одной функции:

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])