Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python将csv数据输出到终端_Python_Python 3.x_Csv_Psql - Fatal编程技术网

如何使用python将csv数据输出到终端

如何使用python将csv数据输出到终端,python,python-3.x,csv,psql,Python,Python 3.x,Csv,Psql,我正在编写一个脚本,将csv文件读取到psql表中,然后对数据进行排序并将其导出到新文件。如何将导出到csv文件的相同数据打印到终端,使其像表格一样显示 以下是我的代码: import psycopg2 import pandas as pd class Products(object): def __init__(self): self.db_connection = psycopg2.connect("host=localhost dbname=rd_assig

我正在编写一个脚本,将csv文件读取到psql表中,然后对数据进行排序并将其导出到新文件。如何将导出到csv文件的相同数据打印到终端,使其像表格一样显示

以下是我的代码:

import psycopg2
import pandas as pd


class Products(object):

    def __init__(self):
        self.db_connection = psycopg2.connect("host=localhost dbname=rd_assignment user=postgres")
        self.db_cur = self.db_connection.cursor()

    def add_column(self):
        """This method adds a column to the products database table. It checks if the table is empty before
        inserting the csv file."""
        self.db_cur.execute("ALTER TABLE products ADD COLUMN IF NOT EXISTS is_active BOOLEAN NOT NULL;")
        self.db_cur.execute("SELECT COUNT(*) FROM products;")
        rows = self.db_cur.fetchall()
        if rows[0][0] < 20:
            self.db_cur.execute(
                "COPY products FROM '/Users/leroy/PycharmProjects/rd_assignment/products.csv' DELIMITERS ',' CSV;")
            self.db_connection.commit()

    def sort_highest(self):
        """This method outputs the products to a csv file according to the highest amount"""
        sort_highest = "COPY (SELECT * FROM products order by amount desc) TO STDOUT DELIMITER ';' CSV HEADER"
        with open("highest_amount.csv", "w") as file:
            self.db_cur.copy_expert(sort_highest, file)
        r = pd.read_csv('/Users/leroy/PycharmProjects/rd_assignment/highest_amount.csv')
        print(r.head(20))

    def get_active(self):
        """This method outputs the active products in the database to a csv file"""
        sort_active = "COPY (SELECT * FROM products WHERE is_active = True) TO STDOUT DELIMITER ';' CSV HEADER"
        with open("active_products.csv", "w") as file:
            self.db_cur.copy_expert(sort_active, file)

    def get_inactive(self):
        """This method outputs the inactive products in the database to a csv file"""
        sort_inactive = \
            "COPY (SELECT description, amount FROM products WHERE is_active = False) TO STDOUT DELIMITER ';' CSV HEADER"
        with open("inactive_products.csv", "w") as file:
            self.db_cur.copy_expert(sort_inactive, file)

    def __del__(self):
        self.db_connection.close()


if __name__ == '__main__':
    instance = Products()
    instance.add_column()
    instance.sort_highest()
    instance.get_active()
    instance.get_inactive()

我不认为有太多的支持内置支持漂亮的打印csv文件到终端。下面是一个快速脚本,可以很好地打印给定的csv文件:

import csv

def pad_col(col, max_width):
    return col.ljust(max_width)

with open('test.csv') as csvfile:
    reader = csv.reader(csvfile)
    all_rows = []
    for row in reader:
        all_rows.append(row)

max_col_width = [0] * len(all_rows[0])
for row in all_rows:
    for idx, col in enumerate(row):
        max_col_width[idx] = max(len(col), max_col_width[idx])

for row in all_rows:
    to_print = ""
    for idx, col in enumerate(row):
        to_print += pad_col(col, max_col_width[idx]) + " | "
    print("-"*len(to_print))
    print(to_print)
如果
test.csv
包含上述csv输入,您将获得以下输出:

-------------------------------------------------------------------------------------------
101 | 9/25/2018 | 9/25/2018 | Sinotec 40" FHD LED TV                        | 5  | TRUE  |
-------------------------------------------------------------------------------------------
102 | 9/25/2018 | 9/25/2018 | Playstation 4 1TB Console - Marvel Spider-man | 5  | TRUE  |
-------------------------------------------------------------------------------------------
103 | 9/25/2018 | 9/25/2018 | Mellerware - 3.5 Litre Tempo Slow Cooker      | 6  | FALSE |
-------------------------------------------------------------------------------------------
104 | 9/25/2018 | 9/25/2018 | Samsung Galaxy S9 64GB - Black                | 12 | TRUE  |
-------------------------------------------------------------------------------------------
105 | 9/25/2018 | 9/25/2018 | Cougar Armor Gaming Chair - Black             | 3  | FALSE |
-------------------------------------------------------------------------------------------
106 | 9/25/2018 | 9/25/2018 | Destiny 2 Legendary Collection(PS4)           | 2  | TRUE  |
-------------------------------------------------------------------------------------------
107 | 9/25/2018 | 9/25/2018 | AIWA 43" Full HD LED TV                       | 3  | FALSE |
-------------------------------------------------------------------------------------------
108 | 9/25/2018 | 9/25/2018 | Ibanez PF17ECE-LG Acoustic/Electric Guitar    | 2  | FALSE |
-------------------------------------------------------------------------------------------
109 | 9/25/2018 | 9/25/2018 | Plantronics Audio 355 Stereo headset - Black  | 6  | TRUE  |
-------------------------------------------------------------------------------------------
110 | 9/25/2018 | 9/25/2018 | Speck Presidio Case for Apple iPhone 7/8      | 6  | FALSE |
-------------------------------------------------------------------------------------------
111 | 9/25/2018 | 9/25/2018 | Skone Langebaan Key Hole UV400 Sunglasses     | 6  | TRUE  |
-------------------------------------------------------------------------------------------
112 | 9/25/2018 | 9/25/2018 | Fadecase Karambit Elite Gamma Doppler Phase 2 | 6  | TRUE  |
-------------------------------------------------------------------------------------------
113 | 9/25/2018 | 9/25/2018 | JBL GO Portable Bluetooth Speaker - Blue      | 6  | TRUE  |
-------------------------------------------------------------------------------------------
114 | 9/25/2018 | 9/25/2018 | WD Blue 250GB 2.5" 3D NAND SATA SSD           | 8  | FALSE |
-------------------------------------------------------------------------------------------
115 | 9/25/2018 | 9/25/2018 | Philips - Metal Kettle - Red                  | 8  | TRUE  |
-------------------------------------------------------------------------------------------
116 | 9/25/2018 | 9/25/2018 | Apple AirPods                                 | 2  | FALSE |
-------------------------------------------------------------------------------------------
117 | 9/25/2018 | 9/25/2018 | Apple Watch Series 3 GPS 42mm                 | 5  | FALSE |
-------------------------------------------------------------------------------------------
118 | 9/25/2018 | 9/25/2018 | Gigabyte GeForce GTX 1080 G1 Gaming Edition   | 8  | FALSE |
-------------------------------------------------------------------------------------------
119 | 9/25/2018 | 9/25/2018 | HTC Vive Eco Black VR Goggles (PC)            | 11 | FALSE |
-------------------------------------------------------------------------------------------
120 | 9/25/2018 | 9/25/2018 | Corsair Vengeance LED 32GB Memory Kit - Red   | 10 | TRUE  |
此解决方案的性能或紧凑性并不特别高。你可以花一整天的时间把它推广到漂亮的印刷CSV上。我将把这些改进项目作为练习留给读者

嗯,至少你应该开始了。

试试prettytable

from prettytable import PrettyTable

x = PrettyTable()

x.field_names = ["Sl.n0", "date1", "date2", "comments","Boolean"]

with open('file.csv') as f:
  line = f.readline()
  while line:
    x.add_row(line.rstrip().split(','))
    line = f.readline()
print x
使用pip安装:
pip安装PrettyTable


查找示例

我建议使用
表格
。它可以输出各种表格格式的数据

from tabulate import tabulate
import pandas as pd

df = pd.read_csv('data.csv')
print(tabulate(df, headers='keys', tablefmt='psql'))
例如:

from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))


+----+-----------+-------------+
|    |   col_two | column_3    |
|----+-----------+-------------|
|  0 |    0.0001 | ABCD        |
|  1 |    1e-05  | ABCD        |
|  2 |    1e-06  | long string |
|  3 |    1e-07  | ABCD        |
+----+-----------+-------------+
支持的表格格式包括:

  • “普通”
  • “简单”
  • “github”
  • “网格”
  • “花式网格”
  • “管道”
  • “orgtbl”
  • “吉拉”
  • “普雷斯托”
  • “psql”
  • “rst”
  • “mediawiki”
  • “moinmoin”
  • “youtrack”
  • “html”
  • “乳胶”
  • “未经加工的乳胶”
  • “latex_图书标签”
  • “纺织品”

print(r.to_csv())
。只是安装的更新,实际上是:
pip3 install ptable
from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))


+----+-----------+-------------+
|    |   col_two | column_3    |
|----+-----------+-------------|
|  0 |    0.0001 | ABCD        |
|  1 |    1e-05  | ABCD        |
|  2 |    1e-06  | long string |
|  3 |    1e-07  | ABCD        |
+----+-----------+-------------+