Python 子进程在 .csv : 'unexpected eof' 上调用 bcp

标签 python csv sqlalchemy eof bcp

我在尝试 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() 的原因)

最佳答案

据我所知,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()

关于Python 子进程在 .csv : 'unexpected eof' 上调用 bcp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739967/

相关文章:

python - pip 模块未安装

python - 如何在额外字段上过滤 Django 查询集?

python - 如何修改 Python 中的生成器?

java - 从 CSV 文件在 Oracle 中批量更新

Python:将字段值提取到新列中,写入Excel

python - sqlalchemy 缺少日期函数

sqlalchemy - 使用 contains_eager 的正确 SqlAlchemy 查询

python - Pandas 评估条件并转换为 0/1 int

javascript - 样式数据并使用 Angularjs 将其导出到 CSV

python - 在 sqlalchemy 中跨不同模块访问相同的 db.session