为了给出模型及其存储在数据库中的数据,我想将其写入 csv 文件。然而,我生成的 csv 文件的第一行的顺序不正确。
models.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))
所以,db中的数据存储如下:
Branch | Status | Curr | Inputter | Createdon | Authorizer | Authorizeon | ID | Description | BranchManagerName | ContactNumber | Address | District | Province | ReportLocked | RegisteredDate | PrevYearAmount | PrevMonthAmount | LocalBranchManagerName | LocalDescription | LocalAddress
--------+--------+------+-----------+---------------------+------------+---------------------+-----+-------------------------+-------------------+---------------+-----------------------------------------------------------------------------------------+----------+----------+--------------+----------------+----------------+-----------------+------------------------+------------------+-----------------------------------------------------------------------------
HO | AUTH | 9 | MINAL | 2018-09-10 21:48:13 | MORAKOT.V | 2018-09-10 21:48:13 | HO | Head Office | Chariya Sambeth | N/A | #3722, Sihanou Blv, Veal Vonging, 7 Makara, Phnom Penh City. | | 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 | Preah Sihanouk Province | Lipop Heang | N/A | Group 1110 Village 1112 Commune 1112 Preah Sihanouk Preah Sihanouk | | 18 | 10000 | 2016-07-28 | 0.000000000 | 0.000000000 | ហៀង លីបផប់ | ខែត្រព្រះសីហនុ | ក្រុម ១១១០ ភូមិ ០២ សង្កាត់ ១១១២ ខណ្ឌព្រះសីហនុ ខេត្តព្រះសីហនុ
HO | AUTH | 2 | MINAL | 2018-09-10 21:50:58 | MORAKOT.V | 2018-09-10 21:50:58 | SRP | Siemreap Province | Vicheka Kong | NA | House 222A, Street 222A, Knar Village Chreav Commune Siem Reap City Siem Reap Province. | 1710 | 17 | 10000 | 2017-11-24 | 0.000000000 | 0.000000000 | គង់ វិច្ឆការ | ខែត្រសៀមរាប | ផ្ទះលេខ២២២អា,<U+200B>ផ្លូវលេខ<U+200B>២២២អា,<U+200B>ភូមិខ្នារ សង្កាត់ជ្រាវ ក្រុងសៀមរាប ខេត្តសៀមរាប
这是我的脚本,用于将这些数据写入 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 Inputter Createdon Authorizer Authorizeon ID Description LocalDescription BranchManagerName LocalBranchManagerName ContactNumber Address LocalAddress District Province ReportLocked RegisteredDate PrevMonthAmount PrevYearAmount
City. <!> ផ្ទះលេខ៥៧១ ក្រុមទី.៥ ផ្លូវ៥៧៤ ភូមិក. ឃុំ-សង្កាត់វាលវង់ ក្រុង-ស្រុក-ខណ្ឌ៧មករា ខេត្ត-រាជធានីភ្នំពេញ 12 10000 2015-12-16 0 0
HO AUTH 6 MORAKOT.V 2018-09-10 21:49:26 MORAKOT.V 2018-09-10 21:49:26 KPS Preah Sihanouk Province ខែត្រព្រះសីហនុ Lipop Heang ហៀង លីបផប់ N/A Group 1110 Village 1112 Commune 1112 Preah Sihanouk Preah Sihanouk ក្រុម ១១១០ ភូមិ ០២ សង្កាត់ ១១១២ ខណ្ឌព្រះសីហនុ ខេត្តព្រះសីហនុ 18 10000 2016-07-28 0 0
HO AUTH 2 MORAKOT.V 2018-09-10 21:50:58 MORAKOT.V 2018-09-10 21:50:58 SRP Siemreap Province ខែត្រសៀមរាប Vicheka Kong គង់ វិច្ឆការ NA House 222A Street 222A Knar Village Chreav Commune Siem Reap City Siem Reap Province. ផ្ទះលេខ២២២អា ផ្លូវលេខ២២២អា ភូមិខ្នារ សង្កាត់ជ្រាវ ក្រុងសៀមរាប ខេត្តសៀមរាប 1710 17 10000 2017-11-24 0 0
数据被截断的位置标记为 <!>
.
出了什么问题?我该如何解决这个问题?谢谢。
最佳答案
我能够使用模拟数据源在本地重现此内容。
看起来您实际上必须关闭文件以确保它已刷新。
f.close() # instead of f.close
您在两个地方执行此操作;请注意,f.close
返回函数,但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)
如果不显式调用 close
,您将由 GC 来决定何时关闭文件,这可能会导致此类错误。请参阅http://blog.lerner.co.il/dont-use-python-close-files-answer-depends/
相关说明:考虑打开文件一次,并将f
传递到writeCSV
中使用,而不是在内部打开文件>writeCSV
。此外,考虑使用 with
语法:
with open("%s.csv"%TableName,"w+") as f:
writeHeader(f)
for item in branchObj:
writeCSV(f, item.id)
这样,您就可以保证以序列化方式使用一个输出流,并且 with
在文件退出时立即将其关闭。
关于python - 如何正确写入CSV文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52260968/