Python 如何正确写入CSV文件?

Python 如何正确写入CSV文件?,python,csv,Python,Csv,为了给出存储在db中的模型及其数据,我想将其写入csv文件。但是,生成的csv文件的第一行顺序不正确 型号.py class BRANCH(): ID = db.Column(db.String(6), primary_key=True) Branch = db.Column(db.String(20)) Status = db.Column(db.String(20))

为了给出存储在db中的模型及其数据,我想将其写入csv文件。但是,生成的csv文件的第一行顺序不正确

型号.py

class BRANCH():
    ID                  =   db.Column(db.String(6), primary_key=True)
    Branch              =   db.Column(db.String(20))
    Status              =   db.Column(db.String(20))
    Curr                =   db.Column(db.String(5))
    Inputter            =   db.Column(db.String(35))
    Createdon           =   db.Column(db.String(20))
    Authorizer          =   db.Column(db.String(35))
    Authorizeon         =   db.Column(db.String(20))
    Description         =   db.Column(db.String(50))
    LocalDescription    =   db.Column(db.String(50))
    BranchManagerName   =   db.Column(db.String(35))
    LocalBranchManagerName = db.Column(db.String(100))
    ContactNumber       =   db.Column(db.String(35))
    Address             =   db.Column(db.String(100))
    LocalAddress        =   db.Column(db.String(100))
    District            =   db.Column(db.String(9))
    Province            =   db.Column(db.String(3))
    ReportLocked        =   db.Column(db.String(1))
    RegisteredDate      =   db.Column(db.String(20))
    PrevMonthAmount     =   db.Column(db.Numeric(25, 9))
    PrevYearAmount      =   db.Column(db.Numeric(25, 9))
因此,数据库中的数据存储如下:

Branch | Status | Curr | input | Createdon | Authorizer | authorizon | ID | Description | BranchManagerName | ContactNumber | Address |地区|省份| ReportLocked | RegisteredDate | PrevYearAmount | PrevMonthAmount |LocalBranchManager名称| LocalDescription | LocalAddress
--------+--------+------+-----------+---------------------+------------+---------------------+-----+-------------------------+-------------------+---------------+-----------------------------------------------------------------------------------------+----------+----------+--------------+----------------+----------------+-----------------+------------------------+------------------+-----------------------------------------------------------------------------
HO | AUTH | 9 | MINAL | 2018-09-10 21:48:13 | MORAKOT.V | 2018-09-10 21:48:13 | HO |总部| Chariya Sambeth | N/A | 3722 |12       | 10000        | 2015-12-16     |    0.000000000 |     0.000000000 | ចរិយាសម្បត្តិ              | ការិយាល័យកណ្តាល     | ផ្ទះលេខ៥៧១ ក្រុមទី.៥ ផ្លូវ៥៧៤ ភូមិក. ឃុំ-សង្កាត់វាលវង់ ក្រុង-ស្រុក-ខណ្ឌ៧មករា ខេត្ត-រាជធានីភ្នំពេញ
HO | AUTH | 6 | MINAL | 2018-09-10 21:49:26 | MORAKOT.V | 2018-09-10 21:49:26 | KPS |柏西哈努克省| Lipop Heang | N/A | 1110村1112社区|柏西哈努克柏西哈努克柏西哈努克| 18 | 10000 | 2016-07-28 | 0.000000000 124000 |ហៀង លីបផប់               | ខែត្រព្រះសីហនុ       | ក្រុម ១១១០ ភូមិ ០២ សង្កាត់ ១១១២ ខណ្ឌព្រះសីហនុ ខេត្តព្រះសីហនុ
HO | AUTH | 2 | MINAL | 2018-09-10 21:50:58 | MORAKOT.V | 2018-09-10 21:50:58 | SRP | Siemreap省| Vicheka Kong | NA | 222A号住宅,暹粒省暹粒市克瑞亚村社区222A街1710     | 17       | 10000        | 2017-11-24     |    0.000000000 |     0.000000000 | គង់ វិច្ឆការ              | ខែត្រសៀមរាប       | ផ្ទះលេខ២២២អា,ផ្លូវលេខ២២២អា,ភូមិខ្នារ សង្កាត់ជ្រាវ ក្រុងសៀមរាប ខេត្តសៀមរាប
下面是将这些数据写入csv文件的脚本:

from app.Branch.models import *
from sqlalchemy.orm import aliased

TableName = 'BRANCH'

Columns = BRANCH.__table__.columns.keys()

def writeCSV(ID):
    f= open("%s.csv"%TableName,"a+")

    obj = BRANCH.query.order_by(BRANCH.ID).filter(BRANCH.ID==ID).first()

    string = ''

    # set body data
    for col in Columns:
        try:
            string = string + "," + getattr(obj,col).encode('utf-8')
        except Exception as e:
            print col
            string = string + "," + str(getattr(obj,col))

    f.write(string[1:]+'\n')

    f.close

string = ''

f= open("%s.csv"%TableName,"w+")
# set header
for col_header in Columns:
    string = string + "," + col_header
f.write(string[1:]+'\n')
f.close

branchObj = BRANCH.query.all()

for item in branchObj:
    writeCSV(item.ID)
但是,最终的csv文件很好,但第一行除外,如下所示:

Branch Status Curr inputer Createdon Authorizer authorizen ID Description LocalDescription BranchManagerName LocalBranchManagerName ContactNumber Address LocalAddress District Province ReportLocked RegisteredDate PrevMonthAmount PrevYearAmount
城市ផ្ទះលេខ៥៧១ ក្រុមទី.៥ ផ្លូវ៥៧៤ ភូមិក. ឃុំ-សង្កាត់វាលវង់ ក្រុង-ស្រុក-ខណ្ឌ៧មករា ខេត្ត-រាជធានីភ្នំពេញ       12  10000   2015-12-16  0   0                                                                   
莫拉克第6期2018-09-10 21:49:26莫拉克第6期2018-09-10 21:49:26 KPS西哈努克省ខែត្រព្រះសីហនុ  脂红ហៀង លីបផប់  N/A集团1110村1112公社1112西哈努克柏哈努克柏哈努克ក្រុម ១១១០ ភូមិ ០២ សង្កាត់ ១១១២ ខណ្ឌព្រះសីហនុ ខេត្តព្រះសីហនុ        18  10000   2016-07-28  0   0               
莫拉克第二期2018-09-10 21:50:58莫拉克第五期2018-09-10 21:50:58 SRP Siemreap省ខែត្រសៀមរាប 孔维切卡គង់ វិច្ឆការ    暹粒省暹粒市克瑞亚夫公社222A街222A号NA House。ផ្ទះលេខ២២២អា    ​ផ្លូវលេខ​២២២អា ​ភូមិខ្នារ សង្កាត់ជ្រាវ ក្រុងសៀមរាប ខេត្តសៀមរាប 1710    17  10000   2017-11-24  0   0
数据被截断的位置由
标记


怎么了?我怎样才能解决这个问题?谢谢。

试试内置的CSV模块。 这里有一个例子

#!/usr/bin/env python3
import csv
导入。可以参考文档对其进行调整

sample = [("Branch", "Status" ,"Curr"), ("HO","AUTH"), ("HO","AUTH",9)]
与您的数据类似的示例输入。让我们考虑第一元组作为标头。< /P>
csv.register_dialect(
            'test', 'unix', delimiter=' ', quoting=csv.QUOTE_NONNUMERIC,
            skipinitialspace=True
        )
test_dialect = csv.get_dialect('test')
这里我们创建一个名为“test”的自定义方言。我们将分隔符指定为一个空格

现在,让我们打开一个文件并将数据写入其中。在with子句中打开文件将自动关闭它。 在这里,我们创建一个csv.writer对象testwriter,使用方言作为我们的自定义测试方言。writerow()将从元组中写入一整行,并使用空格作为分隔符

filename = "test.csv"
with open(filename, 'w', newline='') as csvfile:
            testwriter = csv.writer(csvfile, test_dialect)
            for datas in sample:
                testwriter.writerow(datas)
test.csv文件如下所示:

"Branch" "Status" "Curr"
"HO" "AUTH"
"HO" "AUTH" 9

我能够用模拟的数据源在本地复制这个

看起来您实际上必须关闭该文件以确保它已刷新

f.close()   # instead of f.close
def writeCSV(ID):

    f= open("%s.csv"%TableName,"a+")

    obj = BRANCH.query.order_by(BRANCH.ID).filter(BRANCH.ID==ID).first()

    string = ''

    # set body data
    for col in Columns:
        try:
            string = string + "," + getattr(obj,col).encode('utf-8')
        except Exception as e:
            print col
            string = string + "," + str(getattr(obj,col))

    f.write(string[1:]+'\n')
    f.close()
    if ID == 0:
        # here we simulate what would happen if the GC decides
        # to release the first open handle at this point
        g.close()

string = ''

g= open("%s.csv"%TableName,"w+")  # note the rename for demonstration purposes
# set header
for col_header in Columns:
    string = string + "," + col_header
g.write(string[1:]+'\n')
g.close

branchObj = BRANCH.query.all()

for item in branchObj:
    writeCSV(item.ID)
with open("%s.csv"%TableName,"w+") as f:
    writeHeader(f)
    for item in branchObj:
        writeCSV(f, item.id)