summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkxxoling <kxxoling@gmail.com>2015-05-02 15:43:33 +0800
committerkxxoling <kxxoling@gmail.com>2015-05-02 15:43:33 +0800
commit293263caba313093bd7a6efc02b82408420205a4 (patch)
treed442da94dd3f6e4f76e1c1c37fea179ac06dd16a
parent91aa7455de0c5cdb577732fd80fcd9eb45f65aa1 (diff)
parent74c17b11452586648ad62915506e68c55fbf537c (diff)
downloadpython-prettytable-ptable-293263caba313093bd7a6efc02b82408420205a4.tar.gz
Merge branch 'hotfix/description-fix' into develop
-rw-r--r--README.rst622
-rw-r--r--setup.py8
2 files changed, 627 insertions, 3 deletions
diff --git a/README.rst b/README.rst
index 7b9bb4b..d559b28 100644
--- a/README.rst
+++ b/README.rst
@@ -1,3 +1,621 @@
-.. include:: docs/_meta.rst
-.. include:: docs/installation.rst
+===============
+PTable Tutorial
+===============
+PTable is a simple Python library designed to make it quick and easy to
+represent tabular data in visually appealing ASCII tables, originally
+forked from `PrettyTable <https://code.google.com/p/prettytable/>`_ .
+
+.. image:: https://travis-ci.org/kxxoling/PrettyTable.svg
+ :target: https://travis-ci.org/kxxoling/PrettyTable
+ :alt: Build Status
+
+.. image:: https://landscape.io/github/kxxoling/PTable/master/landscape.svg?style=flat
+ :target: https://landscape.io/github/kxxoling/PTable/master
+ :alt: Code Health
+
+**This tutorial is distributed with PrettyTable and is meant to serve as
+a "quick start" guide for the lazy or impatient. It is not an exhaustive
+description of the whole API, and it is not guaranteed to be 100% up to
+date. For more complete and update documentation, check the PrettyTable
+wiki at http://code.google.com/p/prettytable/w/list**
+
+
+Links
+=====
+
+* `Source Code (GitHub) <https://github.com/kxxoling/PrettyTable>`_
+* `PyPI <https://pypi.python.org/pypi/ptabl://pypi.python.org/pypi/ptable>`_
+* `RTFD <https://ptable.readthedocs.org>`_
+
+
+Getting your data into (and out of) the table
+=============================================
+
+Let's suppose you have a shiny new PrettyTable:
+
+::
+
+ from prettytable import PrettyTable
+ x = PrettyTable()
+
+and you want to put some data into it. You have a few options.
+
+Row by row
+----------
+
+You can add data one row at a time. To do this you can set the field
+names first using the ``field_names`` attribute, and then add the rows
+one at a time using the ``add_row`` method:
+
+::
+
+ x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
+ x.add_row(["Adelaide",1295, 1158259, 600.5])
+ x.add_row(["Brisbane",5905, 1857594, 1146.4])
+ x.add_row(["Darwin", 112, 120900, 1714.7])
+ x.add_row(["Hobart", 1357, 205556, 619.5])
+ x.add_row(["Sydney", 2058, 4336374, 1214.8])
+ x.add_row(["Melbourne", 1566, 3806092, 646.9])
+ x.add_row(["Perth", 5386, 1554769, 869.4])
+
+Column by column
+----------------
+
+You can add data one column at a time as well. To do this you use the
+``add_column`` method, which takes two arguments - a string which is the
+name for the field the column you are adding corresponds to, and a list
+or tuple which contains the column data"
+
+::
+
+ x.add_column("City name",
+ ["Adelaide","Brisbane","Darwin","Hobart","Sydney","Melbourne","Perth"])
+ x.add_column("Area", [1295, 5905, 112, 1357, 2058, 1566, 5386])
+ x.add_column("Population", [1158259, 1857594, 120900, 205556, 4336374, 3806092,
+ 1554769])
+ x.add_column("Annual Rainfall",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9,
+ 869.4])
+
+Mixing and matching
+-------------------
+
+If you really want to, you can even mix and match ``add_row`` and
+``add_column`` and build some of your table in one way and some of it in
+the other. There's a unit test which makes sure that doing things this
+way will always work out nicely as if you'd done it using just one of
+the two approaches. Tables built this way are kind of confusing for
+other people to read, though, so don't do this unless you have a good
+reason.
+
+Importing data from a CSV file
+------------------------------
+
+If you have your table data in a comma separated values file (.csv), you
+can read this data into a PrettyTable like this:
+
+::
+
+ from prettytable import from_csv
+ fp = open("myfile.csv", "r")
+ mytable = from_csv(fp)
+ fp.close()
+
+Importing data from a database cursor
+-------------------------------------
+
+If you have your table data in a database which you can access using a
+library which confirms to the Python DB-API (e.g. an SQLite database
+accessible using the sqlite module), then you can build a PrettyTable
+using a cursor object, like this:
+
+::
+
+ import sqlite3
+ from prettytable import from_cursor
+
+ connection = sqlite3.connect("mydb.db")
+ cursor = connection.cursor()
+ cursor.execute("SELECT field1, field2, field3 FROM my_table")
+ mytable = from_cursor(cursor)
+
+Getting data out
+----------------
+
+There are three ways to get data out of a PrettyTable, in increasing
+order of completeness:
+
+- The ``del_row`` method takes an integer index of a single row to
+ delete.
+- The ``clear_rows`` method takes no arguments and deletes all the rows
+ in the table - but keeps the field names as they were so you that you
+ can repopulate it with the same kind of data.
+- The ``clear`` method takes no arguments and deletes all rows and all
+ field names. It's not quite the same as creating a fresh table
+ instance, though - style related settings, discussed later, are
+ maintained.
+
+Displaying your table in ASCII form
+===================================
+
+PrettyTable's main goal is to let you print tables in an attractive
+ASCII form, like this:
+
+::
+
+ +-----------+------+------------+-----------------+
+ | City name | Area | Population | Annual Rainfall |
+ +-----------+------+------------+-----------------+
+ | Adelaide | 1295 | 1158259 | 600.5 |
+ | Brisbane | 5905 | 1857594 | 1146.4 |
+ | Darwin | 112 | 120900 | 1714.7 |
+ | Hobart | 1357 | 205556 | 619.5 |
+ | Melbourne | 1566 | 3806092 | 646.9 |
+ | Perth | 5386 | 1554769 | 869.4 |
+ | Sydney | 2058 | 4336374 | 1214.8 |
+ +-----------+------+------------+-----------------+
+
+You can print tables like this to ``stdout`` or get string
+representations of them.
+
+Printing
+--------
+
+To print a table in ASCII form, you can just do this:
+
+::
+
+ print x
+
+in Python 2.x or:
+
+::
+
+ print(x)
+
+in Python 3.x.
+
+The old x.printt() method from versions 0.5 and earlier has been
+removed.
+
+To pass options changing the look of the table, use the get\_string()
+method documented below:
+
+::
+
+ print x.get_string()
+
+Stringing
+---------
+
+If you don't want to actually print your table in ASCII form but just
+get a string containing what *would* be printed if you use "print x",
+you can use the ``get_string`` method:
+
+::
+
+ mystring = x.get_string()
+
+This string is guaranteed to look exactly the same as what would be
+printed by doing "print x". You can now do all the usual things you can
+do with a string, like write your table to a file or insert it into a
+GUI.
+
+Controlling which data gets displayed
+-------------------------------------
+
+If you like, you can restrict the output of ``print x`` or
+``x.get_string`` to only the fields or rows you like.
+
+The ``fields`` argument to these methods takes a list of field names to
+be printed:
+
+::
+
+ print x.get_string(fields=["City name", "Population"])
+
+gives:
+
+::
+
+ +-----------+------------+
+ | City name | Population |
+ +-----------+------------+
+ | Adelaide | 1158259 |
+ | Brisbane | 1857594 |
+ | Darwin | 120900 |
+ | Hobart | 205556 |
+ | Melbourne | 3806092 |
+ | Perth | 1554769 |
+ | Sydney | 4336374 |
+ +-----------+------------+
+
+The ``start`` and ``end`` arguments take the index of the first and last
+row to print respectively. Note that the indexing works like Python list
+slicing - to print the 2nd, 3rd and 4th rows of the table, set ``start``
+to 1 (the first row is row 0, so the second is row 1) and set ``end`` to
+4 (the index of the 4th row, plus 1):
+
+::
+
+ print x.get_string(start=1,end=4)
+
+prints:
+
+::
+
+ +-----------+------+------------+-----------------+
+ | City name | Area | Population | Annual Rainfall |
+ +-----------+------+------------+-----------------+
+ | Brisbane | 5905 | 1857594 | 1146.4 |
+ | Darwin | 112 | 120900 | 1714.7 |
+ | Hobart | 1357 | 205556 | 619.5 |
+ +-----------+------+------------+-----------------+
+
+Changing the alignment of columns
+---------------------------------
+
+By default, all columns in a table are centre aligned.
+
+All columns at once
+~~~~~~~~~~~~~~~~~~~
+
+You can change the alignment of all the columns in a table at once by
+assigning a one character string to the ``align`` attribute. The allowed
+strings are "l", "r" and "c" for left, right and centre alignment,
+respectively:
+
+::
+
+ x.align = "r"
+ print x
+
+gives:
+
+::
+
+ +-----------+------+------------+-----------------+
+ | City name | Area | Population | Annual Rainfall |
+ +-----------+------+------------+-----------------+
+ | Adelaide | 1295 | 1158259 | 600.5 |
+ | Brisbane | 5905 | 1857594 | 1146.4 |
+ | Darwin | 112 | 120900 | 1714.7 |
+ | Hobart | 1357 | 205556 | 619.5 |
+ | Melbourne | 1566 | 3806092 | 646.9 |
+ | Perth | 5386 | 1554769 | 869.4 |
+ | Sydney | 2058 | 4336374 | 1214.8 |
+ +-----------+------+------------+-----------------+
+
+One column at a time
+~~~~~~~~~~~~~~~~~~~~
+
+You can also change the alignment of individual columns based on the
+corresponding field name by treating the ``align`` attribute as if it
+were a dictionary.
+
+::
+
+ x.align["City name"] = "l"
+ x.align["Area"] = "c"
+ x.align["Population"] = "r"
+ x.align["Annual Rainfall"] = "c"
+ print x
+
+gives:
+
+::
+
+ +-----------+------+------------+-----------------+
+ | City name | Area | Population | Annual Rainfall |
+ +-----------+------+------------+-----------------+
+ | Adelaide | 1295 | 1158259 | 600.5 |
+ | Brisbane | 5905 | 1857594 | 1146.4 |
+ | Darwin | 112 | 120900 | 1714.7 |
+ | Hobart | 1357 | 205556 | 619.5 |
+ | Melbourne | 1566 | 3806092 | 646.9 |
+ | Perth | 5386 | 1554769 | 869.4 |
+ | Sydney | 2058 | 4336374 | 1214.8 |
+ +-----------+------+------------+-----------------+
+
+Sorting your table by a field
+-----------------------------
+
+You can make sure that your ASCII tables are produced with the data
+sorted by one particular field by giving ``get_string`` a ``sortby``
+keyword argument, which > must be a string containing the name of one
+field.
+
+For example, to print the example table we built earlier of Australian
+capital city data, so that the most populated city comes last, we can do
+this:
+
+::
+
+ print x.get_string(sortby="Population")
+
+to get
+
+::
+
+ +-----------+------+------------+-----------------+
+ | City name | Area | Population | Annual Rainfall |
+ +-----------+------+------------+-----------------+
+ | Darwin | 112 | 120900 | 1714.7 |
+ | Hobart | 1357 | 205556 | 619.5 |
+ | Adelaide | 1295 | 1158259 | 600.5 |
+ | Perth | 5386 | 1554769 | 869.4 |
+ | Brisbane | 5905 | 1857594 | 1146.4 |
+ | Melbourne | 1566 | 3806092 | 646.9 |
+ | Sydney | 2058 | 4336374 | 1214.8 |
+ +-----------+------+------------+-----------------+
+
+If we want the most populated city to come *first*, we can also give a
+``reversesort=True`` argument.
+
+If you *always* want your tables to be sorted in a certain way, you can
+make the setting long term like this:
+
+::
+
+ x.sortby = "Population"
+ print x
+ print x
+ print x
+
+All three tables printed by this code will be sorted by population (you
+could do ``x.reversesort = True`` as well, if you wanted). The behaviour
+will persist until you turn it off:
+
+::
+
+ x.sortby = None
+
+If you want to specify a custom sorting function, you can use the
+``sort_key`` keyword argument. Pass this a function which accepts two
+lists of values and returns a negative or positive value depending on
+whether the first list should appeare before or after the second one. If
+your table has n columns, each list will have n+1 elements. Each list
+corresponds to one row of the table. The first element will be whatever
+data is in the relevant row, in the column specified by the ``sort_by``
+argument. The remaining n elements are the data in each of the table's
+columns, in order, including a repeated instance of the data in the
+``sort_by`` column.
+
+Changing the appearance of your table - the easy way
+====================================================
+
+By default, PrettyTable produces ASCII tables that look like the ones
+used in SQL database shells. But if can print them in a variety of other
+formats as well. If the format you want to use is common, PrettyTable
+makes this very easy for you to do using the ``set_style`` method. If
+you want to produce an uncommon table, you'll have to do things slightly
+harder (see later).
+
+Setting a table style
+---------------------
+
+You can set the style for your table using the ``set_style`` method
+before any calls to ``print`` or ``get_string``. Here's how to print a
+table in a format which works nicely with Microsoft Word's "Convert to
+table" feature:
+
+::
+
+ from prettytable import MSWORD_FRIENDLY
+ x.set_style(MSWORD_FRIENDLY)
+ print x
+
+In addition to ``MSWORD_FRIENDLY`` there are currently two other
+in-built styles you can use for your tables:
+
+- ``DEFAULT`` - The default look, used to undo any style changes you
+ may have made
+- ``PLAIN_COLUMN`` - A borderless style that works well with command
+ line programs for columnar data
+
+Other styles are likely to appear in future releases.
+
+Changing the appearance of your table - the hard way
+====================================================
+
+If you want to display your table in a style other than one of the
+in-built styles listed above, you'll have to set things up the hard way.
+
+Don't worry, it's not really that hard!
+
+Style options
+-------------
+
+PrettyTable has a number of style options which control various aspects
+of how tables are displayed. You have the freedom to set each of these
+options individually to whatever you prefer. The ``set_style`` method
+just does this automatically for you.
+
+The options are these:
+
+- ``border`` - A boolean option (must be ``True`` or ``False``).
+ Controls whether > > or not a border is drawn around the table.
+- ``header`` - A boolean option (must be ``True`` or ``False``).
+ Controls whether > > or not the first row of the table is a header
+ showing the names of all the > > fields.
+- ``hrules`` - Controls printing of horizontal rules after rows.
+ Allowed > > values: FRAME, HEADER, ALL, NONE - note that these are
+ variables defined > > inside the ``prettytable`` module so make sure
+ you import them or use > > ``prettytable.FRAME`` etc.
+- ``vrules`` - Controls printing of vertical rules between columns.
+ Allowed > > values: FRAME, ALL, NONE.
+- ``int_format`` - A string which controls the way integer data is
+ printed. > > This works like: ``print "%<int_format>d" % data``
+- ``float_format`` - A string which controls the way floating point
+ data is > > printed. This works like:
+ ``print "%<int_format>f" % data``
+- ``padding_width`` - Number of spaces on either side of column data
+ (only used > > if left and right paddings are None).
+- ``left_padding_width`` - Number of spaces on left hand side of column
+ data.
+- ``right_padding_width`` - Number of spaces on right hand side of
+ column data.
+- ``vertical_char`` - Single character string used to draw vertical
+ lines. > > Default is ``|``.
+- ``horizontal_char`` - Single character string used to draw horizontal
+ lines. > > Default is ``-``.
+- ``junction_char`` - Single character string used to draw line
+ junctions. > > Default is ``+``.
+
+You can set the style options to your own settings in two ways:
+
+Setting style options for the long term
+---------------------------------------
+
+If you want to print your table with a different style several times,
+you can set your option for the "long term" just by changing the
+appropriate attributes. If you never want your tables to have borders
+you can do this:
+
+::
+
+ x.border = False
+ print x
+ print x
+ print x
+
+Neither of the 3 tables printed by this will have borders, even if you
+do things like add extra rows inbetween them. The lack of borders will
+last until you do:
+
+::
+
+ x.border = True
+
+to turn them on again. This sort of long term setting is exactly how
+``set_style`` works. ``set_style`` just sets a bunch of attributes to
+pre-set values for you.
+
+Note that if you know what style options you want at the moment you are
+creating your table, you can specify them using keyword arguments to the
+constructor. For example, the following two code blocks are equivalent:
+
+::
+
+ x = PrettyTable()
+ x.border = False
+ x.header = False
+ x.padding_width = 5
+
+x = PrettyTable(border=False, header=False, padding\_width=5)
+
+Changing style options just once
+--------------------------------
+
+If you don't want to make long term style changes by changing an
+attribute like in the previous section, you can make changes that last
+for just one ``get_string`` by giving those methods keyword arguments.
+To print two "normal" tables with one borderless table between them, you
+could do this:
+
+::
+
+ print x
+ print x.get_string(border=False)
+ print x
+
+Displaying your table in HTML form
+==================================
+
+PrettyTable will also print your tables in HTML form, as ``<table>``\ s.
+Just like in ASCII form, you can actually print your table - just use
+``print_html()`` - or get a string representation - just use
+``get_html_string()``. HTML printing supports the ``fields``, ``start``,
+``end``, ``sortby`` and ``reversesort`` arguments in exactly the same
+way as ASCII printing.
+
+Styling HTML tables
+-------------------
+
+By default, PrettyTable outputs HTML for "vanilla" tables. The HTML code
+is quite simple. It looks like this:
+
+::
+
+ <table>
+ <tr>
+ <th>City name</th>
+ <th>Area</th>
+ <th>Population</th>
+ <th>Annual Rainfall</th>
+ </tr>
+ <tr>
+ <td>Adelaide</td>
+ <td>1295</td>
+ <td>1158259</td>
+ <td>600.5</td>
+ <tr>
+ <td>Brisbane</td>
+ <td>5905</td>
+ <td>1857594</td>
+ <td>1146.4</td>
+ ...
+ ...
+ ...
+ </table>
+
+If you like, you can ask PrettyTable to do its best to mimick the style
+options that your table has set using inline CSS. This is done by giving
+a ``format=True`` keyword argument to either the ``print_html`` or
+``get_html_string`` methods. Note that if you *always* want to print
+formatted HTML you can do:
+
+::
+
+ x.format = True
+
+and the setting will persist until you turn it off.
+
+Just like with ASCII tables, if you want to change the table's style for
+just one ``print_html`` or one ``get_html_string`` you can pass those
+methods keyword arguments - exactly like ``print`` and ``get_string``.
+
+Setting HTML attributes
+-----------------------
+
+You can provide a dictionary of HTML attribute name/value pairs to the
+``print_html`` and ``get_html_string`` methods using the ``attributes``
+keyword argument. This lets you specify common HTML attributes like
+``name``, ``id`` and ``class`` that can be used for linking to your
+tables or customising their appearance using CSS. For example:
+
+::
+
+ x.print_html(attributes={"name":"my_table", "class":"red_table"})
+
+will print:
+
+::
+
+ <table name="my_table" class="red_table">
+ <tr>
+ <th>City name</th>
+ <th>Area</th>
+ <th>Population</th>
+ <th>Annual Rainfall</th>
+ </tr>
+ ...
+ ...
+ ...
+ </table>
+
+Miscellaneous things
+====================
+
+Copying a table
+---------------
+
+You can call the ``copy`` method on a PrettyTable object without
+arguments to return an identical independent copy of the table.
+
+If you want a copy of a PrettyTable object with just a subset of the
+rows, you can use list slicing notation:
+
+::
+
+ new_table = old_table[0:5]
diff --git a/setup.py b/setup.py
index b26e409..8eeb9c5 100644
--- a/setup.py
+++ b/setup.py
@@ -3,6 +3,11 @@ from setuptools import setup
from prettytable import __version__ as version
+def fread(filepath):
+ with open(filepath, 'r') as f:
+ return f.read()
+
+
setup(
name='PTable',
version=version,
@@ -25,11 +30,12 @@ setup(
],
license="BSD (3 clause)",
description='A simple Python library for easily displaying tabular data in a visually appealing ASCII table format',
+ long_description=fread('README.rst'),
author='Luke Maurits',
author_email='luke@maurits.id.au',
maintainer='Kane Blueriver',
maintainer_email='kxxoling@gmail.com',
- url='http://code.google.com/p/prettytable',
+ url='https://github.com/kxxoling/PTable',
py_modules=['prettytable', 'prettytable.cli', 'prettytable.prettytable',
'prettytable.factory', 'prettytable._compact'],
test_suite="test_prettytable",