Python 如何正确写入CSV文件?
为了给出存储在db中的模型及其数据,我想将其写入csv文件。但是,生成的csv文件的第一行顺序不正确 型号.pyPython 如何正确写入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))
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)