Конвертер XLS в CSV

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

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

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

 agf27 мар. 2012 г., 08:33
Пожалуйста, опубликуйте сообщение об ошибке и полный возврат
 SpliFF27 мар. 2012 г., 08:34
удалите попытку / кроме первого, вы не получите такую полезную ошибку, как эта.

Ответы на вопрос(10)

В моих листах есть такая колонка

2013-03-06T04: 00: 00

дата и время в одной ячейке

Это искажается во время экспорта, это так в экспортированном файле

41275.0416667

другие столбцы в порядке.

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

 user163281221 июл. 2018 г., 15:26
извини, я забыл, что я тогда делал. Я узнал, что это не случайное число, это внутреннее представление, которое использует Excel или datetime. Так что есть алгоритм, чтобы получить правильную дату и время.
 Sailanarmo18 июл. 2018 г., 18:57
Я сделал то же самое, и я получаю такой же мусор. Знаете ли вы о решении этого?
 user163281221 июл. 2018 г., 15:26
Я не могу быть более точным, извини

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

Файл Excel обычно поставляется с именем листа.

-s is sheetname index.

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

постскриптумcsvkit тоже круто

csvkit, который использует xlrd (для xls) и openpyxl (для xlsx) для преобразования практически любых табличных данных в csv.

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

python in2csv myfile > myoutput.csv

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

 devforfu15 июн. 2017 г., 12:11
Понравился и этот инструмент. Не совсем относится к этому вопросу, но я встречал упоминание об этом csvkitэта книга наряду с некоторыми другими утилитами обработки данных, которые позволяют вам преобразовывать данные прямо в вашей оболочке.

s в файл csv. Ниже приведен код, который преобразует файл xls в файл csv. импорт панд в виде pd

Прочитать файл Excel из локального пути:

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

Обрезать пробелы в столбцах:

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

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

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

ответ изСкотт Мин, который работает с книгой, содержащей несколько листов:

Вот скрипт на питонеgetsheets.py (зеркало), вам следует установить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()

я хотел бы использовать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 упоминается в других ответах.

 Gyan05 июл. 2017 г., 16:00
какие-либо советы по обработке символов новой строки, которые могут быть в содержимом ячейки Excel?
 CodeFarmer02 нояб. 2016 г., 06:47
@philE Это слишком медленно. Используйте xlsx2csv
 Shauket Sheikh05 сент. 2016 г., 07:16
это не работает в случае, если у вас есть текст на других языках в rows.it показывает ??? в текст

но они были слишком медленными для меня. Если у вас установлен 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. один раз.

кроссплатформенный и работает напрямую с файлом.Следует отметить одну вещь - она не работает с файлами 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()
 sharafjaffri29 нояб. 2012 г., 14:34
Поддерживает ли преобразование datetime из режима данных xls в обычный datetime
 kuujo23 окт. 2012 г., 00:45
Не должно ли это бытьwr.writerow(sh.row_values(rownum))? ВидетьВот.
 Stew30 июн. 2015 г., 22:21
ВНИМАНИЕ: этот подход не сохранит форматирование Excel определенных чисел. Целочисленные числовые значения будут записаны в десятичной форме (например, 2 -> 2.0), целочисленные формулы также будут записаны в десятичной форме (например, = A1 / B2 показывает как 1, но экспортирует как 0.9912319), и ведущие нули текста -форматированные числовые значения будут удалены (например, «007» -> «7.0»). Удачи в поисках мистера Бонда в вашей базе данных секретных агентов! Если вам повезет, эти проблемы возникнут в явных неудачах. Если вам не повезет, они могут молча отравить ваши данные.
 Jetse23 июл. 2013 г., 16:13
Новейшая версия работает для файлов xlsx:pypi.python.org/pypi/xlrd/0.9.2
 Li-aung Yip25 июн. 2015 г., 09:32
Если вы не знаете название листа (т.е. это неSheet1) тогда вы можете использоватьwb.sheet_by_index(0) получить первый лист, независимо от его названия.

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

# -*- 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])
 Javier Novoa C.16 июл. 2014 г., 21:10
всего пара аннотаций: некоторые листы могут быть пустыми. Я не вижу никакой утилиты для генерации пустых файлов CSV, лучше сделайте предыдущую оценку на worksheet.nrows> 0, прежде чем делать что-либо.
 duhaime01 мая 2015 г., 19:28
Вы можете пропустить пустые листы сif worksheet.nrows == 0: continue
 andilabs07 сент. 2017 г., 15:01
@OrhanYazar попробуй сu'{}.csv'.format(worksheet_name) уведомлениеu в начале стоит unciode
 Javier Novoa C.16 июл. 2014 г., 21:10
Кроме того, было бы лучше использовать контексты для файла CSV;)
 Orhan Yazar01 авг. 2017 г., 09:57
Я получаюFile "<ipython-input-24-5fa644cde9f8>", line 15, in <module> csv_from_excel("Analyse Article Lustucru PF.xlsx") File "<ipython-input-24-5fa644cde9f8>", line 6, in csv_from_excel with open('{}.csv'.format(worksheet_name), 'wb') as your_csv_file: UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 2: ordinal not in range(128) ты знаешь как с этим бороться?

потому что вы теряете форматы даты в 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()

Ваш ответ на вопрос