我有以下内容:
import pyodbc
# ODBC connection to database
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=CCSQLRESUME;DATABASE=ResumeStore;UID=ray;PWD=Yar!')
cursor = cnxn.cursor()
# SELECT resume data
cursor.execute(
"""SELECT
rbs.candidate_id,
rbs.[fileName],
rbs.resumeData,
rbs.docType
FROM [ResumeStore].[dbo].[ResumeBinaryStorage] as rbs (NOLOCK)
WHERE rbs.candidate_id = 5078707"""
)
在查询时,resumeData
的数据已存储在bytearray
中,如此:bytearray(b'\xef\xbb\xbf<html><body><h1><b>Ray Bao</b></h1><h2>')
我想要一个遍历上面光标的for循环,并将resumeData
列写入具有给定fileName
的本地存储。
for row in cursor:
#
# Write to file...
#
我该怎么做?
答案 0 :(得分:5)
你可以只将数据写入以二进制模式打开的文件:
with open('filename', 'wb') as f:
for row in cursor:
f.write(row[2])
f.write(b'\n')
但请注意,您的示例resumeData
列包含UTF-8 BOM;你可能想先删除它:
import codecs
with open('filename', 'wb') as f:
for row in cursor:
resumeData = row[2]
if resumeData.startswith(codecs.BOM_UTF8):
resumeData = resumeData[3:]
f.write(row[2])
防止使用重复的BOM字符污染文件(UTF-8确实不需要)。
您的另一个选择是解码数据并以文本模式写入文件:
with open('filename', 'w') as f:
for row in cursor:
f.write(row[2].decode('utf-8-sig')
f.write(b'\n')
其中utf-8-sig
是需要UTF-8 BOM的编解码器(但如果丢失则不会抱怨)。
如果要编写每行一个文件,请打开新文件对象:
for row in cursor:
with open(row[1], 'wb') as f:
f.write(row[2])
再次作为二进制文件,因此您不必担心该列使用的编解码器。