将bytearray写入文件?

Ray*_*Ray 1 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"""
)
Run Code Online (Sandbox Code Playgroud)

在查询时,数据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...
  #
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Mar*_*ers 5

可以将数据写入以二进制模式打开的文件:

with open('filename', 'wb') as f:
   for row in cursor:
       f.write(row[2])
       f.write(b'\n')
Run Code Online (Sandbox Code Playgroud)

但请注意,您的样本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])
Run Code Online (Sandbox Code Playgroud)

防止使用重复的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')
Run Code Online (Sandbox Code Playgroud)

哪里utf-8-sig是需要UTF-8 BOM的编解码器(但如果丢失则不会抱怨).

如果要每行写一个文件,请打开新文件对象:

for row in cursor:
    with open(row[1], 'wb') as f:
        f.write(row[2])
Run Code Online (Sandbox Code Playgroud)

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