Python子进程在.csv上调用bcp:'意外的eof'

时间:2012-05-24 14:53:59

标签: python csv sqlalchemy eof bcp

我在尝试使用Python的csv.writer生成的.csv文件时遇到了EOF问题。我做了大量的谷歌搜索,没有运气,所以我转向你有用的人在SO

这是错误消息(在subprocess.call()行上触发):

Starting copy...
Unexpected EOF encountered in BCP data-file.
bcp copy in failed

以下是代码:

sel_str = 'select blahblahblah...'
result = engine.execute(sel_str)  #engine is a SQLAlchemy engine instance

# write to disk temporarily to be able to bcp the results to the db temp table
with open('tempscratch.csv','wb') as temp_bcp_file:
    csvw = csv.writer(temp_bcp_file)
    for r in result:
        csvw.writerow(r)
        temp_bcp_file.flush()

# upload the temp scratch file
bcp_string = 'bcp tempdb..collection in @INFILE -c -U username -P password -S DSN'
bcp_string = string.replace(bcp_string,'@INFILE','tempscratch.csv')
result_code = subprocess.call(bcp_string, shell=True)

我在文本编辑器中查看了tempscratch.csv文件,但没有看到任何奇怪的EOF或其他控制字符。此外,我查看了其他.csv文件进行比较,似乎没有bcp正在寻找的标准化EOF。

此外,是的,这是hacky,拉下结果集,将其写入磁盘,然后使用bcp将其重新上载到数据库。我必须这样做,因为SQLAlchemy不支持同一个execute()命令中的多行语句(也称为DDL和DML)。此外,这个连接是一个Sybase数据库,它不支持SQLAlchemy的精彩ORM :((这就是为什么我首先使用execute())

1 个答案:

答案 0 :(得分:5)

据我所知,bcp默认字段分隔符是制表符'\ t',而Python的csv编写器默认为逗号。试试这个......

# write to disk temporarily to be able to bcp the results to the db temp table
with open('tempscratch.csv','wb') as temp_bcp_file:
    csvw = csv.writer(temp_bcp_file, delimiter = '\t')
    for r in result:
        csvw.writerow(r)
    temp_bcp_file.flush()