Конвертер 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")
Я не могу найти ошибку в этом коде. Пожалуйста, помогите.
Ответы
Ответ 1
Я бы использовал 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
Я бы использовал 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
, упомянутую в других ответах.
Ответ 3
Возможно, кто-то найдет эту полезную часть кода полезной. Это позволяет создавать 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])
Ответ 4
Я бы использовал csvkit, который использует xlrd (для xls) и openpyxl (для xlsx) для преобразования практически любых табличных данных к csv.
После установки, с его зависимостями, это вопрос:
python in2csv myfile > myoutput.csv
Он заботится обо всех проблемах с обнаружением формата, поэтому вы можете передать его практически любому источнику табличных данных. Это тоже кросс-платформенная (без зависимости от win32).
Ответ 5
@andi Я проверил ваш код, он отлично работает, НО
В моих листах есть столбец, подобный этому
2013-03-06T04: 00: 00
дата и время в той же ячейке
При экспорте он искажается, как в экспортированном файле
41275.0416667
другие столбцы в порядке.
csvkit, с другой стороны, работает с этим столбцом, но экспортирует только один лист, а в моих файлах много.
Ответ 6
xlsx2csv быстрее, чем pandas и xlrd.
xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase
Файл excel обычно содержит n имя_файла.
-s is sheetname index.
тогда будет создана папка cruchbase, каждый лист принадлежит xlsx, будет преобразован в один csv.
p.s. csvkit тоже ужасно.
Ответ 7
Цитирую ответ Скотта Мина, который работает с книгой, содержащей несколько листов:
Вот скрипт python 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()
Ответ 8
Сначала прочтите вашу таблицу Excel в pandas, нижеприведенный код импортирует вашу таблицу Excel в pandas в виде типа OrderedDict, который содержит все ваши рабочие листы в виде фреймов данных. Затем просто используйте имя рабочего листа в качестве ключа для доступа к определенному рабочему листу в качестве информационного кадра и сохраните только требуемый рабочий лист в виде файла csv с помощью df.to_csv(). Надеюсь, что в вашем случае это поможет.
import pandas as pd
df = pd.read_excel('YourExcel.xlsx', sheet_name=None)
df['worksheet_name'].to_csv('YourCsv.csv')
Если ваш файл Excel содержит только один лист, просто используйте следующий код:
import pandas as pd
df = pd.read_excel('YourExcel.xlsx')
df.to_csv('YourCsv.csv')
Если кто-то хочет преобразовать все рабочие листы Excel из одной рабочей книги Excel в разные CSV файлы, попробуйте следующий код:
import pandas as pd
def excelTOcsv(filename):
df = pd.read_excel(filename, sheet_name=None)
for key, value in df.items():
return df[key].to_csv('%s.csv' %key)
Эта функция работает как несколько листов Excel одной и той же книги Excel в несколько файлов CSV конвертер. Где ключ - имя листа, а значение - содержимое внутри листа.
Ответ 9
Использование 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()
Ответ 10
Я тестировал всех ответчиков, но они были слишком медленными для меня. Если у вас установлен 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 один раз.
Ответ 11
Мы можем использовать Pandas lib из Python для преобразования файла xls в файл 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)
Ответ 12
Как бы мне не хотелось полагаться на проприетарное программное обеспечение Windows Excel, которое не является кроссплатформенным, мое тестирование csvkit
для .xls, в котором используется xlrd
, не смогло правильно проанализировать даты (даже при использовании параметров командной строки для указания strptime формат).
Например, этот файл xls при csvkit
преобразует ячейку G1
с 12/31/2002
в 37621
, тогда как при преобразовании в csv через excel → save_as (используя ниже) ячейка G1
будет иметь значение "December 31, 2002"
.
import re
import os
from win32com.client import Dispatch
xlCSVMSDOS = 24
class CsvConverter(object):
def __init__(self, *, input_dir, output_dir):
self._excel = None
self.input_dir = input_dir
self.output_dir = output_dir
if not os.path.isdir(self.output_dir):
os.makedirs(self.output_dir)
def isSheetEmpty(self, sheet):
# https://archive.is/RuxR7
# WorksheetFunction.CountA(ActiveSheet.UsedRange) = 0 And ActiveSheet.Shapes.Count = 0
return \
(not self._excel.WorksheetFunction.CountA(sheet.UsedRange)) \
and \
(not sheet.Shapes.Count)
def getNonEmptySheets(self, wb, as_name=False):
return [ \
(sheet.Name if as_name else sheet) \
for sheet in wb.Sheets \
if not self.isSheetEmpty(sheet) \
]
def saveWorkbookAsCsv(self, wb, csv_path):
non_empty_sheet_names = self.getNonEmptySheets(wb, as_name=True)
assert (len(non_empty_sheet_names) == 1), \
"Expected exactly 1 sheet but found %i non-empty sheets: '%s'" \
%(
len(non_empty_sheet_names),
"', '".join(name.replace("'", r"\'") for name in non_empty_sheet_names)
)
wb.Worksheets(non_empty_sheet_names[0]).SaveAs(csv_path, xlCSVMSDOS)
wb.Saved = 1
def isXlsFilename(self, filename):
return bool(re.search(r'(?i)\.xls$', filename))
def batchConvertXlsToCsv(self):
xls_names = tuple( filename for filename in next(os.walk(self.input_dir))[2] if self.isXlsFilename(filename) )
self._excel = Dispatch('Excel.Application')
try:
for xls_name in xls_names:
csv_path = os.path.join(self.output_dir, '%s.csv' %os.path.splitext(xls_name)[0])
if not os.path.isfile(csv_path):
workbook = self._excel.Workbooks.Open(os.path.join(self.input_dir, xls_name))
try:
self.saveWorkbookAsCsv(workbook, csv_path)
finally:
workbook.Close()
finally:
if not len(self._excel.Workbooks):
self._excel.Quit()
self._excel = None
if __name__ == '__main__':
self = CsvConverter(
input_dir='C:\\data\\xls\\',
output_dir='C:\\data\\csv\\'
)
self.batchConvertXlsToCsv()
Вышеприведенное будет принимать input_dir
содержащий .xls, и выводить их в output_dir
как .csv - оно будет assert
что в .xls ровно 1 непустой лист; если вам нужно обработать несколько листов в несколько CSV, то вам нужно отредактировать saveWorkbookAsCsv
.