Как Pretty Печать CSV-файла в Python

Как я могу печатать CSV-файл с помощью Python, а не внешнего инструмента?

Например, у меня есть этот файл CSV:

title1|title2|title3|title4 datalongdata|datalongdata|data|data data|data|data|datalongdatadatalongdatadatalongdatadatalongdatadatalongdata data|data'data|dat 

Я хотел бы преобразовать его, чтобы визуально выглядеть как таблица. Например, что-то вроде этого:

 + --------------------------------------------------------------------------------------------------- + | title1 | title2 | title3 | title4 | + --------------------------------------------------------------------------------------------------- + | datalongdata | datalongdata | data | data | | | | | | | data | data | data | datalongdatadatalongdatadatalongdatadatalongdatadatalongdata | | data | data'data | dat | | + --------------------------------------------------------------------------------------------------- + 

2 Solutions collect form web for “Как Pretty Печать CSV-файла в Python”

Применение:

pretty.pretty_file ( имя файла , *** опции *)

Читает файл CSV и визуально выводит данные в виде таблицы в новый файл. filename , является данным CSV-файлом. Необязательные опции *** options * keyword – это объединение модуля Csv стандартной библиотеки Python Dialeters и параметров форматирования и следующего списка:

  • new_delimiter : новый разделитель столбцов (по умолчанию «|»)
  • border : логическое значение, если вы хотите напечатать границу таблицы (по умолчанию True)
  • border_vertical_left : левая граница таблицы (по умолчанию «|»)
  • border_vertical_right : правая граница таблицы (по умолчанию «|»)
  • border_horizontal : верхняя и нижняя границы таблицы (по умолчанию «-»)
  • border_corner_tl : верхний левый угол таблицы (по умолчанию «+»)
  • border_corner_tr : верхний правый угол таблицы (по умолчанию «+»)
  • border_corner_bl : нижний левый угол таблицы (по умолчанию такой же, как border_corner_tl )
  • border_corner_br : нижний правый угол таблицы (по умолчанию такой же, как border_corner_tr )
  • header : boolean value, если первая строка является заголовком таблицы (по умолчанию True)
  • border_header_separator : граница между заголовком и таблицей (по умолчанию такая же, как border_horizontal )
  • border_header_left : левая граница заголовка таблицы (по умолчанию такая же, как border_corner_tl )
  • border_header_right : правая граница заголовка таблицы (по умолчанию такая же, как border_corner_tr )
  • new_filename : имя файла нового файла (по умолчанию «new_» + имя файла )
  • newline : определяет, как будут разделены строки таблицы (по умолчанию «\ n»)

Пример:

 import pretty_csv pretty_csv.pretty_file("test.csv", header=False, border=False, delimiter="|") 

Python 3:

Это реализация Python 2. Для Python 3 вы должны изменить 2 вхождения строки open(filename, "rb") as input: open(filename, "r", newline="") as input: поскольку csv.reader в Python 3 хочет файл, который нужно открыть в текстовом режиме.

Модуль:

 import csv def pretty_file(filename, **options): """ @summary: Reads a CSV file and prints visually the data as table to a new file. @param filename: is the path to the given CSV file. @param **options: the union of Python's Standard Library csv module Dialects and Formatting Parameters and the following list: @param new_delimiter: the new column separator (default " | ") @param border: boolean value if you want to print the border of the table (default True) @param border_vertical_left: the left border of the table (default "| ") @param border_vertical_right: the right border of the table (default " |") @param border_horizontal: the top and bottom border of the table (default "-") @param border_corner_tl: the top-left corner of the table (default "+ ") @param border_corner_tr: the top-right corner of the table (default " +") @param border_corner_bl: the bottom-left corner of the table (default same as border_corner_tl) @param border_corner_br: the bottom-right corner of the table (default same as border_corner_tr) @param header: boolean value if the first row is a table header (default True) @param border_header_separator: the border between the header and the table (default same as border_horizontal) @param border_header_left: the left border of the table header (default same as border_corner_tl) @param border_header_right: the right border of the table header (default same as border_corner_tr) @param newline: defines how the rows of the table will be separated (default "\n") @param new_filename: the new file's filename (*default* "/new_" + filename) """ #function specific options new_delimiter = options.pop("new_delimiter", " | ") border = options.pop("border", True) border_vertical_left = options.pop("border_vertical_left", "| ") border_vertical_right = options.pop("border_vertical_right", " |") border_horizontal = options.pop("border_horizontal", "-") border_corner_tl = options.pop("border_corner_tl", "+ ") border_corner_tr = options.pop("border_corner_tr", " +") border_corner_bl = options.pop("border_corner_bl", border_corner_tl) border_corner_br = options.pop("border_corner_br", border_corner_tr) header = options.pop("header", True) border_header_separator = options.pop("border_header_separator", border_horizontal) border_header_left = options.pop("border_header_left", border_corner_tl) border_header_right = options.pop("border_header_right", border_corner_tr) newline = options.pop("newline", "\n") file_path = filename.split(os.sep) old_filename = file_path[-1] new_filename = options.pop("new_filename", "new_" + old_filename) column_max_width = {} #key:column number, the max width of each column num_rows = 0 #the number of rows with open(filename, "rb") as input: #parse the file and determine the width of each column reader=csv.reader(input, **options) for row in reader: num_rows += 1 for col_number, column in enumerate(row): width = len(column) try: if width > column_max_width[col_number]: column_max_width[col_number] = width except KeyError: column_max_width[col_number] = width max_columns = max(column_max_width.keys()) + 1 #the max number of columns (having rows with different number of columns is no problem) if max_columns > 1: total_length = sum(column_max_width.values()) + len(new_delimiter) * (max_columns - 1) left = border_vertical_left if border is True else "" right = border_vertical_right if border is True else "" left_header = border_header_left if border is True else "" right_header = border_header_right if border is True else "" with open(filename, "rb") as input: reader=csv.reader(input, **options) with open(new_filename, "w") as output: for row_number, row in enumerate(reader): max_index = len(row) - 1 for index in range(max_columns): if index > max_index: row.append(' ' * column_max_width[index]) #append empty columns else: diff = column_max_width[index] - len(row[index]) row[index] = row[index] + ' ' * diff #append spaces to fit the max width if row_number==0 and border is True: #draw top border output.write(border_corner_tl + border_horizontal * total_length + border_corner_tr + newline) output.write(left + new_delimiter.join(row) + right + newline) #print the new row if row_number==0 and header is True: #draw header's separator output.write(left_header + border_header_separator * total_length + right_header + newline) if row_number==num_rows-1 and border is True: #draw bottom border output.write(border_corner_bl + border_horizontal * total_length + border_corner_br) 

Для этого имеется небольшая библиотека

  • Как получить pandas.read_csv () для вывода типов datetime и timedelta из столбцов файла CSV?
  • Пропустить первую строку (поле) в цикле с использованием файла CSV?
  • Ошибка в python, csv и mysql: Ошибка: 1054 (42S22): Неизвестный столб 'nan' в 'списке полей'
  • Как вы динамически идентифицируете неизвестные разделители в файле данных?
  • как заменить все вхождения определенных символов?
  • Импорт CSV-файлов в базу данных SQL с использованием SQLite в Python
  • Можно ли использовать SQL для разделения содержимого столбца таблицы, хранящегося в CSV (значения, разделенные запятой) на отдельные строки в новой таблице?
  • Как включить динамическое время?
  •  
    Interesting Posts for Van-Lav

    Могу ли я гнездо TestCases с носом?

    psycopg2 cursor.execute () с параметром SQL query вызывает синтаксическую ошибку

    структурированный язык запросов для JSON (в Python)

    Вставка нового атрибута в документ с использованием MongoDB (Python)

    Хозяева не найдены: Ткань

    Найти словарные ключи с повторяющимися значениями

    Словарь Python содержит список как значение – как обновить?

    Невозможно получить изображение dicom для отображения в python

    Python: добавление полей к объектам динамически

    Как преобразовать любое изображение в 4-цветное палитру изображения с помощью библиотеки изображений Python?

    Что занимает память в этом for-loop?

    Почему я получаю сообщение об ошибке: команда 'llvm-gcc-4.2' не удалась с статусом выхода 1

    Автоматическое размещение аннотации (matploylib.pyplot) или аннотации списков

    Векторизованное движущееся окно на 2D-массиве в numpy

    Как я могу наложить два графика в Сиборн?

    Python - лучший язык программирования в мире.