将bytearray写入文件?

时间:2014-08-07 20:29:25

标签: python pyodbc

我有以下内容:

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...
  #

我该怎么做?

1 个答案:

答案 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])

再次作为二进制文件,因此您不必担心该列使用的编解码器。