2012-03-27 6 views
37

Я использую win32.client в python для преобразования моего .xlsx и .xls файла в .csv. Когда я выполняю этот код, он дает ошибку. Мой код:xls to csv converter

def convertXLS2CSV(aFile): 
    '''converts a MS Excel file to csv w/ the same name in the same directory''' 

    print "------ beginning to convert XLS to CSV ------" 

    try: 
     import win32com.client, os 
     from win32com.client import constants as c 
     excel = win32com.client.Dispatch('Excel.Application') 

     fileDir, fileName = os.path.split(aFile) 
     nameOnly = os.path.splitext(fileName) 
     newName = nameOnly[0] + ".csv" 
     outCSV = os.path.join(fileDir, newName) 
     workbook = excel.Workbooks.Open(aFile) 
     workbook.SaveAs(outCSV, c.xlCSVMSDOS) # 24 represents xlCSVMSDOS 
     workbook.Close(False) 
     excel.Quit() 
     del excel 

     print "...Converted " + nameOnly + " to CSV" 
    except: 
     print ">>>>>>> FAILED to convert " + aFile + " to CSV!" 

convertXLS2CSV("G:\\hello.xlsx") 

Я не могу найти ошибку в этом коде. Пожалуйста помоги.

+2

Пожалуйста, разместите ошибку и полный ответ – agf

+7

удалите try/except во-первых, вы не получите такую ​​полезную ошибку. – SpliFF

ответ

50

Я бы использовал xlrd - это быстрее, перекрестная платформа и работает непосредственно с файлом. Одно замечание - оно не работает с файлами xlsx, поэтому вам нужно сохранить файл Excel как xls. Редактировать: Начиная с версии 0.8.0, xlrd считывает файлы XLS и XLSX.

import xlrd 
import csv 

def csv_from_excel(): 

    wb = xlrd.open_workbook('your_workbook.xls') 
    sh = wb.sheet_by_name('Sheet1') 
    your_csv_file = open('your_csv_file.csv', 'wb') 
    wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 

    for rownum in xrange(sh.nrows): 
     wr.writerow(sh.row_values(rownum)) 

    your_csv_file.close() 
+2

Не должно быть 'wr.writerow (sh.row_values ​​(rownum))'? См. [Здесь] (https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html#sheet.Sheet.row_values-method). – kuujo

+2

Поддерживает ли это преобразование datetime из xls datmode в обычное datetime – sharafjaffri

+0

Новейшая версия работает для xlsx-файлов: https://pypi.python.org/pypi/xlrd/0.9.2 – Jetse

17

Я хотел бы использовать csvkit, который использует xlrd (для XLS) и openpyxl (для XLSX), чтобы конвертировать практически любые табличные данные в формате CSV.

После установки, с его зависимостями, это вопрос:

python in2csv myfile > myoutput.csv 

Он берет на себя все вопросы, обнаружения в формате, так что вы можете передать его как раз о любом табличном источнике данных. Это тоже кросс-платформенный (без зависимости от win32).

+0

Как этот инструмент также. Не совсем уместен этот вопрос, но я встретил упоминание этой статьи csvkit в [этой книге] (http://shop.oreilly.com/product/0636920032823.do) наряду с некоторыми другими утилитами обработки данных, которые позволяют вам для преобразования данных прямо внутри вашей оболочки. – devforfu

27

Возможно, кто-то найдет этот готовый код полезной для использования. Это позволяет создавать CSV-файлы из всех электронных таблиц в книге Excel.

enter image description here

# -*- coding: utf-8 -*- 
import xlrd 
import csv 
from os import sys 

def csv_from_excel(excel_file): 
    workbook = xlrd.open_workbook(excel_file) 
    all_worksheets = workbook.sheet_names() 
    for worksheet_name in all_worksheets: 
     worksheet = workbook.sheet_by_name(worksheet_name) 
     with open('{}.csv'.format(worksheet_name), 'wb') as your_csv_file: 
      wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 
      for rownum in xrange(worksheet.nrows): 
       wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) 

if __name__ == "__main__": 
    csv_from_excel(sys.argv[1]) 
+0

всего пару аннотаций: некоторые листы могут быть пустыми. Я не вижу никакой полезности при создании пустых CSV-файлов, лучше сделайте предыдущую оценку на workheet.nrows> 0, прежде чем делать что-либо. –

+0

также было бы лучше использовать контексты для файла CSV;) –

+1

Вы можете пропустить пустые листы с 'if worksheet.nrows == 0: continue' – duhaime

25

Я хотел бы использовать pandas. Вычислительные тяжелые части записываются в cython или c-extensions для ускорения процесса, и синтаксис очень чист. Например, если вы хотите повернуть «Sheet1» из файла «your_workbook.xls» в файл «your_csv.csv», вы просто используете функцию верхнего уровня read_excel и метод to_csv из класса DataFrame следующим образом:

import pandas as pd 
data_xls = pd.read_excel('your_workbook.xls', 'Sheet1', index_col=None) 
data_xls.to_csv('your_csv.csv', encoding='utf-8') 

Установка encoding='utf-8' устраняет UnicodeEncodeError, упомянутый в других ответах.

+0

, он не работает, если у вас есть текст других языков в rows.it показывает? ? в тексте –

+1

@philE Это слишком медленно. Используйте xlsx2csv – CodeFarmer

+0

любые советы по обработке символов новой строки, которые могут быть в содержимом ячейки excel? – Gyan

2

@andi Я проверил ваш код, он прекрасно работает, НО

В моих листах есть столбец, как этот

2013-03-06T04: 00: 00

дата и время в та же клетка

он получает искаженные при экспорте, это так в экспортируемый файл

41275,0416667

другие колонки в порядке.

csvkit, с другой стороны, работает с этой колонкой, но экспортирует только один лист, а в моих файлах много.

3

xlsx2csv является быстрее, чем панд и xlrd.

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase 

Файл excel обычно имеет n простыни.

-s is sheetname index. 

тогда, папка cruchbase будет создана, каждый лист принадлежит XLSX будут преобразованы в один CSV.

p.s. csvkit тоже потрясающе.

0

Использование xlrd - это неправильный способ сделать это, потому что вы теряете форматы даты в Excel.

Мое использование - следующее.

Возьмите файл Excel с более чем одним листом и конвертируйте каждый из них в собственный файл.

Я сделал это с помощью библиотеки xlsx2csv и вызвал это с помощью подпроцесса.

import csv 
import sys, os, json, re, time 
import subprocess 

def csv_from_excel(fname): 
    subprocess.Popen(["xlsx2csv " + fname + " --all -d '|' -i -p " 
         "'<New Sheet>' > " + 'test.csv'], shell=True) 

    return 

lstSheets = csv_from_excel(sys.argv[1]) 

time.sleep(3) # system needs to wait a second to recognize the file was written 

with open('[YOUR PATH]/test.csv') as f: 
    lines = f.readlines() 
    firstSheet = True 

    for line in lines: 
     if line.startswith('<New Sheet>'): 
      if firstSheet: 
       sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') 
       print(sh_2_fname) 
       sh2f = open(sh_2_fname+".csv", "w") 
       firstSheet = False 
      else: 
       sh2f.close() 
       sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') 
       print(sh_2_fname) 
       sh2f = open(sh_2_fname+".csv", "w") 
     else: 
      sh2f.write(line) 
sh2f.close() 
0

Я тестировал все анвееры, но они были слишком медленными для меня. Если у вас установлен Excel, вы можете использовать COM.

Я думал, что это будет медленнее, так как он загрузит все для реального приложения Excel, но это не для огромных файлов. Может быть, потому, что алгоритм для открытия и сохранения файлов запускает сильно оптимизированный скомпилированный код, ребята из Microsoft в конечном итоге делают для него большие деньги.

import sys 
import os 
import glob 
from win32com.client import Dispatch 

def main(path): 
    excel = Dispatch("Excel.Application") 
    if is_full_path(path): 
     process_file(excel, path) 
    else: 
     files = glob.glob(path) 
     for file_path in files: 
      process_file(excel, file_path) 
    excel.Quit() 

def process_file(excel, path): 
    fullpath = os.path.abspath(path) 
    full_csv_path = os.path.splitext(fullpath)[0] + '.csv' 
    workbook = excel.Workbooks.Open(fullpath) 
    workbook.Worksheets(1).SaveAs(full_csv_path, 6) 
    workbook.Saved = 1 
    workbook.Close() 


def is_full_path(path): 
    return path.find(":") > -1 

if __name__ == '__main__': 
    main(sys.argv[1]) 

Это очень сырой код и не будет проверять на наличие ошибок, печати помощи или что-нибудь, это будет просто создать файл CSV для каждого файла, который соответствует шаблону, введенное в функцию, так что вы можете пакетной обработки много файлов только запускает приложение excel один раз.

1

Цитирование в answer из Scott Ming, который работает с книги, содержащие несколько листов:

Вот питон скрипт getsheets.py (mirror), вы должны установить pandas и xlrd, прежде чем использовать его.

Выполнить это:

pip3 install pandas xlrd # or `pip install pandas xlrd` 

Как это работает?

$ python3 getsheets.py -h 
Usage: getsheets.py [OPTIONS] INPUTFILE 

Convert a Excel file with multiple sheets to several file with one sheet. 

Examples: 

    getsheets filename 

    getsheets filename -f csv 

Options: 
-f, --format [xlsx|csv] Default xlsx. 
-h, --help    Show this message and exit. 

Преобразовать в нескольких XLSX:

$ python3 getsheets.py goods_temp.xlsx 
Sheet.xlsx Done! 
Sheet1.xlsx Done! 

All Done! 

Преобразовать в нескольких CSV:

$ python3 getsheets.py goods_temp.xlsx -f csv 
Sheet.csv Done! 
Sheet1.csv Done! 

All Done! 

getsheets.py:

# -*- coding: utf-8 -*- 

import click 
import os 
import pandas as pd 


def file_split(file): 
    s = file.split('.') 
    name = '.'.join(s[:-1]) # get directory name 
    return name 


def getsheets(inputfile, fileformat): 
    name = file_split(inputfile) 
    try: 
     os.makedirs(name) 
    except: 
     pass 

    df1 = pd.ExcelFile(inputfile) 
    for x in df1.sheet_names: 
     print(x + '.' + fileformat, 'Done!') 
     df2 = pd.read_excel(inputfile, sheetname=x) 
     filename = os.path.join(name, x + '.' + fileformat) 
     if fileformat == 'csv': 
      df2.to_csv(filename, index=False) 
     else: 
      df2.to_excel(filename, index=False) 
    print('\nAll Done!') 


CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) 


@click.command(context_settings=CONTEXT_SETTINGS) 
@click.argument('inputfile') 
@click.option('-f', '--format', type=click.Choice([ 
    'xlsx', 'csv']), default='xlsx', help='Default xlsx.') 
def cli(inputfile, format): 
    '''Convert a Excel file with multiple sheets to several file with one sheet. 

    Examples: 

    \b 
     getsheets filename 

    \b 
     getsheets filename -f csv 
    ''' 
    if format == 'csv': 
     getsheets(inputfile, 'csv') 
    else: 
     getsheets(inputfile, 'xlsx') 


cli() 
0

Мы можем использовать панды LIB в Python для conevert XLS файл в файл csv Ниже код преобразует файл xls в файл csv. импорт панды как э.р.

Чтение Excel файлы с локального пути:

df = pd.read_excel("C:/Users/IBM_ADMIN/BU GPA Scorecard.xlsx",sheetname=1) 

уравновешивания пространства присутствует на колоннах:

df.columns = df.columns.str.strip() 

Отправить кадр данных в CSV-файл, который будет delimted символ трубы и без Индекс:

df.to_csv("C:/Users/IBM_ADMIN/BU GPA Scorecard csv.csv",sep="|",index=False)