从文本文件创建 table 并添加一列

Creating a table from a text file and adding a column

我在从 Python 上创建的 table 添加某些值时遇到了一些问题。
我的文本文件如下所示:

E5345,22/09/2015,C106,815,A,400
E5348,23/09/2015,C109,370,A,200
E5349,25/09/2015,C110,480,A,250
E5353,28/09/2015,C114,272,A,200
E5363,01/10/2015,C124,930,A,500
E5364,02/10/2015,C125,915,A,800
E5365,02/10/2015,C126,1486,A,1486
E5366,03/10/2015,C127,576,E,0
E5367,03/10/2015,C128,427,A,350
E5373,10/10/2015,C134,1023,A,550

我希望使用这些值在 python 上创建一个 table,并创建另一列,标题为未结金额。我设法做到了这一点,但我想找到未偿还的总和。这是通过执行第四列 (finaltotal) 减去第六列找到的。 (amountpaid).
到目前为止我的代码是:

headers = ["| Estimate Number", "| Date", "| Customer Number", "| Final Total", "| Status", "| Amount Paid", "| Outstanding Amount"]
print("    ".join(headers))
print ("\n-------------------------------------------------------------------------------------------------------------------------")
data = open("paintingJobs.txt", "r")
info=data.readlines()
data.close()
for li in info:
        line = li.strip().split(",")
        status=line[4]
        finaltotal=int(line[3])
        amountpaid=int(line[5])
        subtotal = int(line[3]) - int(line[5])
        outstanding = (finaltotal) - (amountpaid)
        line.append(str(subtotal))
        if (amountpaid) < (finaltotal) and status == "A":
                for i, word in enumerate(line):
                    print(word.ljust(len(headers[i - (i > 20)])), end="     " * ((i - (i > 20)) != len(headers) - 1))
                print()
                print ("-------------------------------------------------------------------------------------------------------------------------")

    print ("\nThe total revenue is")

我的理想输出是:

| Estimate Number    | Date    | Customer Number    | Final Total    | Status    | Amount Paid    | Outstanding Amount

-------------------------------------------------------------------------------------------------------------------------
E5345                 22/09/2015     C106                  815               A            400               415
-------------------------------------------------------------------------------------------------------------------------
E5348                 23/09/2015     C109                  370               A            200               170
-------------------------------------------------------------------------------------------------------------------------
E5349                 25/09/2015     C110                  480               A            250               230
-------------------------------------------------------------------------------------------------------------------------
E5353                 28/09/2015     C114                  272               A            200               72
-------------------------------------------------------------------------------------------------------------------------
E5355                 29/09/2015     C116                  530               A            450               80
-------------------------------------------------------------------------------------------------------------------------
E5363                 01/10/2015     C124                  930               A            500               430
-------------------------------------------------------------------------------------------------------------------------
E5364                 02/10/2015     C125                  915               A            800               115
-------------------------------------------------------------------------------------------------------------------------
E5367                 03/10/2015     C128                  427               A            350               77
-------------------------------------------------------------------------------------------------------------------------
E5373                 10/10/2015     C134                  1023              A            550               473
-------------------------------------------------------------------------------------------------------------------------

The total outstanding is
£2062

总数 outstanding 是通过计算 outstanding 金额的总和得出的。未结金额等于 finaltotal 减去 amountpaid。任何帮助将不胜感激。

只需在循环外使用一个变量来跟踪总数。我排除了多付的人,但如果你想从总数中扣除,你可以删除 if 语句。

total = 0
for li in info:
    ...
    outstanding = (finaltotal) - (amountpaid)
    if outstanding > 0:
         total += outstanding

print 'The total outstanding is {}'.format(total)

为什么不使用 Pandas 库?假设您的初始 table 在名为 example.csv 的 csv 文件中。您可以通过很少的步骤完成此操作,如下所示:

from pandas import read_csv

df = read_csv('~/Documents/example.csv', header=None)
df.columns = ["Estimate Number", "Date", "Customer Number", "Final Total", "Status", "Amount Paid"]
df['Outstanding Amount'] = df['Final Total'] - df['Amount Paid']

然后您可以选择输出。您可以输出回 csv 文件:

df.to_csv()

或打印出来:

table_as_text = df.to_string()
print(table_as_text)

这会给你:

Estimate Number        Date Customer Number  Final Total Status    Amount Paid  Outstanding Amount
0           E5345  22/09/2015            C106          815      A          400                 415
1           E5348  23/09/2015            C109          370      A          200                 170
2           E5349  25/09/2015            C110          480      A          250                 230
3           E5353  28/09/2015            C114          272      A          200                  72
4           E5363  01/10/2015            C124          930      A          500                 430
5           E5364  02/10/2015            C125          915      A          800                 115
6           E5365  02/10/2015            C126         1486      A         1486                   0
7           E5366  03/10/2015            C127          576      E            0                 576
8           E5367  03/10/2015            C128          427      A          350                  77
9           E5373  10/10/2015            C134         1023      A          550                 473

要计算总和,您可以这样做:

outstanding_amount = df["Outstanding Amount"].sum()
print(outstanding_amount)

查看 http://pandas.pydata.org/pandas-docs/stable。希望对您有所帮助!