2017-01-04 4 views
1

Я ищу для преобразования данного файла excel в csv, используя csvkit в качестве библиотеки, а не из командной строки. У меня возникли проблемы с поиском информации о синтаксисе использования библиотеки. Может ли кто-нибудь пролить свет на то, как использовать csvkit в качестве библиотеки для этой цели?Использование библиотеки Csvkit

Мой тестовый пример прост - возьмите input.xlsx или input.xls, преобразуйте и сохраните как output.csv. Вот что я пытался до сих пор, который основан на предложениях, найденных в другом месте:

import csvkit 

with open('input.xlsx') as csvfile: 
    reader = in2csv(csvfile) 
    # below is just to test whether the file could be accessed 
    for row in reader: 
     print(row) 

дает

Traceback (most recent call last): 
    File "excelconvert.py", line 6, in <module> 
    reader = in2csv(csvfile) 
NameError: name 'in2csv' is not defined 

Там есть подобный вопрос here, но ответы только, кажется, ссылаться на документацию, либо ISN» t, или на самом деле не объясняет синтаксис использования библиотеки, он просто перечисляет классы. Существует ответ, предполагающий, что синтаксис может быть похож на модуль csv, и это то, что я использовал, чтобы сделать попытку выше, но я никуда не уйду.

+0

Вы пытаетесь прочитать в файле? Или преобразовать его в csv?Судя по документам, которые вы связали, похоже, что это предназначено для использования в качестве утилиты командной строки – mwm314

+0

Я пытаюсь ее преобразовать, у меня есть строки для чтения, чтобы помочь мне посмотреть, открыт ли файл/преобразован файл – Marcatectura

+0

Is есть причина, по которой вы не можете использовать его из командной строки, как предлагают документы? Он не предназначен для использования в качестве библиотеки python. – mwm314

ответ

2

Документы настоятельно рекомендуют использовать инструмент командной строки, который нельзя использовать из интерпретатора Python. Вы можете сделать что-то вроде этого, чтобы преобразовать файл в формате CSV из командной строки (или вы могли бы вытолкнуть его в сценарий оболочки):

in2csv your_file.xlsx > your_new_file.csv 

Если вы хотите, чтобы прочитать файл, просто сделать это (это похоже на то, что у вас есть, но вы не нужны никакие внешние модули, просто использовать встроенный в Python):

with open('input.xlsx') as csvfile: 
    reader = csvfile.readlines() # This was the only line of your code I changed 
    # below is just to test whether the file could be accessed 
    for row in reader: 
     print(row) 

Или вы могли бы назвать вашу командную строку с помощью os модуля:

# Careful, raw sys call. Use subprocess.Popen 
# if you need to accept untrusted user input here 
os.popen("in2csv your_file.xlsx > your_new_file.csv").read() 

Один f вышеописанные фрагменты, вероятно, то, что вам нужно, но если вы действительно ищете наказание, вы можете попытаться использовать файл in2csv внутри интерпретатора. Вот как вы можете пойти о выполнении этого (нет поддержки этого в документации, что я мог бы найти, это только мне ковыряться в интерпретаторе):

>>> from csvkit import in2csv 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: cannot import name in2csv 
>>> import csvkit 
>>> help(csvkit) 
Help on package csvkit: 

NAME 
    csvkit 

FILE 
    c:\python27\lib\site-packages\csvkit\__init__.py 

DESCRIPTION 
    This module contains csvkit's superpowered alternative to the standard Python 
    CSV reader and writer. It can be used as a drop-in replacement for the standard 
    module. 

    .. warn:: 

     Since version 1.0 csvkit relies on `agate <http://agate.rtfd.org>`_'s 
    CSV reader and writer. This module is supported for legacy purposes only and you 
    should migrate to using agate. 

PACKAGE CONTENTS 
    cleanup 
    cli 
    convert (package) 
    exceptions 
    grep 
    utilities (package) 

Таким образом, вы не можете импортировать in2csv непосредственно из csvkit (поскольку он не указан в списке PACKAGE CONTENTS). Однако, если вы немного поиграете, вы обнаружите, что можете получить доступ к пакету от csvkit.utilities. Но отсюда только ухудшается. Если вы делаете больше «помогать охоте» (т. Е. Вызывая помощь у интерпретатора), как указано выше, вы обнаружите, что класс был разработан для использования из командной строки. Так что это настоящая боль в заднице, чтобы использовать ее внутри интерпретатора. Вот пример того, чтобы использовать значения по умолчанию (результат взрыва):

>>> from csvkit.utilities import in2csv 
>>> i = in2csv.In2CSV() 
>>> i.main() 
usage: [-h] [-d DELIMITER] [-t] [-q QUOTECHAR] [-u {0,1,2,3}] [-b] 
     [-p ESCAPECHAR] [-z FIELD_SIZE_LIMIT] [-e ENCODING] [-S] [-H] [-v] 
     [-l] [--zero] [-f FILETYPE] [-s SCHEMA] [-k KEY] [--sheet SHEET] 
     [-y SNIFF_LIMIT] [--no-inference] 
     [FILE] 
: error: You must specify a format when providing data via STDIN (pipe). 

Взглянув на in2csv.py модуля, вам придется обезьяны патч args, чтобы заставить его делать то, что вы хотите изнутри переводчика. Опять же, это не было предназначено для использования внутри интерпретатора, оно предназначалось для вызова из строки cmd (так что args определяется, если вы вызываете его из строки cmd). Кажется, что-то вроде этого бежало, но я не тестировал его полностью:

>>> from csvkit.utilities import in2csv 
>>> i = in2csv.In2CSV() 
>>> from collections import namedtuple 
>>> i.args = namedtuple("patched_args", "input_path filetype no_inference") 
>>> i.args.input_path = "/path/to/your/file.xlsx" 
>>> i.args.no_inference = True 
>>> i.args.filetype = None 
>>> i.main() 
Смежные вопросы