【问题标题】:Export a BCP file into CSV format将 BCP 文件导出为 CSV 格式
【发布时间】:2016-03-01 18:02:44
【问题描述】:

我想从中提取数据 Data Charity Register Extract 并将其导出为 Excel 文件 (.csv)。

此人在 Github 上发布了他的代码,使用 import.py file

我是这样做的:有两种方式:

第一种方式:

  1. 我从上面的链接下载文件:RegPlusExtract_November_2015.zip 并将其放在 C:\Python27(我也安装 Python)中

  2. 我在 IDLE 中打开下面的代码文件 (import.py) 和后面的 (bcp.py) 并运行 import.py(使用 F5)。我把这两个 .py 文件放在 C:\Python27

#!/usr/bin/env python
import bcp
import zipfile
import sys

cc_files = {
    "extract_acct_submit": [
      "regno",
      "submit_date",
      "arno",
      "fyend"
    ], 
    "extract_aoo_ref": [
      "aootype",
      "aookey",
      "aooname",
      "aoosort",
      "welsh",
      "master",
      "code"
    ], 
    "extract_ar_submit": [
      "regno",
      "arno",
      "submit_date"
    ], 
    "extract_charity": [
      "regno",
      "subno",
      "name",
      "orgtype",
      "gd",
      "aob",
      "aob_defined",
      "nhs",
      "ha_no",
      "corr",
      "add1",
      "add2",
      "add3",
      "add4",
      "add5",
      "postcode",
      "phone",
      "fax",
    ], 
    "extract_charity_aoo": [
      "regno",
      "aootype",
      "aookey",
      "welsh",
      "master"
    ], 
    "extract_class": [
      "regno",
      "class"
    ], 
    "extract_class_ref": [
      "classno",
      "classtext",
    ], 
    "extract_financial": [
      "regno",
      "fystart",
      "fyend",
      "income",
      "expend"
    ], 
    "extract_main_charity": [
      "regno",
      "coyno",
      "trustees",
      "fyend",
      "welsh",
      "incomedate",
      "income",
      "grouptype",
      "email",
      "web"
    ], 
    "extract_name": [
      "regno",
      "subno",
      "nameno",
      "name"
    ], 
    "extract_objects": [
      "regno",
      "subno",
      "seqno",
      "object"
    ], 
    "extract_partb": [
      "regno",
      "artype",
      "fystart",
      "fyend",
      "inc_leg",
      "inc_end",
      "inc_vol",
      "inc_fr",
      "inc_char",
      "inc_invest",
      "inc_other",
      "inc_total",
      "invest_gain",
      "asset_gain",
      "pension_gain",
      "exp_vol",
      "exp_trade",
      "exp_invest",
      "exp_grant",
      "exp_charble",
      "exp_gov",
      "exp_other",
      "exp_total",
      "exp_support",
      "exp_dep",
      "reserves",
      "asset_open",
      "asset_close",
      "fixed_assets",
      "open_assets",
      "invest_assets",
      "cash_assets",
      "current_assets",
      "credit_1",
      "credit_long",
      "pension_assets",
      "total_assets",
      "funds_end",
      "funds_restrict",
      "funds_unrestrict",
      "funds_total",
      "employees",
      "volunteers",
      "cons_acc",
      "charity_acc"
    ], 
    "extract_registration": [
      "regno",
      "subno",
      "regdate",
      "remdate",
      "remcode"
    ], 
    "extract_remove_ref": [
      "code",
      "text"
    ], 
    "extract_trustee": [
      "regno",
      "trustee"
    ]
}

def import_zip(zip_file):
    zf = zipfile.ZipFile(zip_file, 'r')
    print 'Opened zip file: %s' % zip_file
    for filename in cc_files:
        try:
            bcp_filename = filename + '.bcp'
            csv_filename = filename + '.csv'
            bcpdata = zf.read(bcp_filename)
            bcp.convert(bcpdata, csvfilename=csv_filename, col_headers=cc_files[filename])
            print 'Converted: %s' % bcp_filename
        except KeyError:
            print 'ERROR: Did not find %s in zip file' % bcp_filename

def main():
    zip_file = sys.argv[1]
    import_zip(zip_file)

if __name__ == '__main__':
    main()

#!/usr/bin/env python
import sys
import csv

def convert(bcpdata, csvfilename="", lineterminator='*@@*', delimiter='@**@', quote='"', newdelimiter=',', col_headers=None, escapechar='\\', newline='\n'):
    bcpdata = bcpdata.replace(escapechar, escapechar + escapechar)
    bcpdata = bcpdata.replace(quote, escapechar + quote)
    bcpdata = bcpdata.replace(delimiter, quote + newdelimiter + quote)
    bcpdata = bcpdata.replace(lineterminator, quote + newline + quote)
    if csvfilename=="":
        csvfilename = 'converted.csv'
    with open(csvfilename, 'wb') as csvfile:
        if(col_headers):
            writer = csv.writer(csvfile)
            writer.writerow(col_headers)
        csvfile.write('"')
        csvfile.write(bcpdata)
        csvfile.write('"')

def main():
    bcp_filename = sys.argv[1]
    try:
        csv_filename = sys.argv[2]
    except IndexError:
        csv_filename = bcp_filename.replace('.bcp', '.csv')
    with open(bcp_filename, 'rb') as bcpfile:
        bcpdata = bcpfile.read()
        convert(bcpdata, csv_filename)

if __name__ == '__main__':
    main()

这个错误让我印象深刻:

>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "C:\Python27\bcp.py", line 31, in <module>
    main()
  File "C:\Python27\bcp.py", line 21, in main
    bcp_filename = sys.argv[1]
IndexError: list index out of range
>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "C:\Python27\import.py", line 175, in <module>
    main()
  File "C:\Python27\import.py", line 171, in main
    zip_file = sys.argv[1]
IndexError: list index out of range
>>> 

谁能指出哪里出错了?

第二种方式:

然后我尝试在 Windows 中使用命令提示符来运行该文件: 首先,我将路径设置为保存所有文件的位置 (C:\python27) 然后我在命令提示符下运行

python import RegPlusExtract_November_2015.zip

这让我印象深刻:错误:

 File"<stdin>", line 1

python import RegPlusExtract_November_2015.zip

请任何人指出我哪里弄错了,或者告诉我如何从上面的数据链接中提取 csv 文件。

【问题讨论】:

  • 看起来它想要文件名作为命令行参数,而您没有提供它。试试python import.py RegPlusExtract_February_2015.zip
  • 非常感谢,它给了我:文件“”.line 1 SyntaxError: invalid syntax
  • 嗨@pnuts:你能解释更多吗?我不明白回滚是什么意思。
  • 您好,非常感谢。是的,我的意思是 CSV 文件。是的。谢谢!
  • 请说出输入文件的名称(bcp 格式),并说明您是如何启动脚本的。否则,我们将无法为您提供帮助

标签: python csv bcp


【解决方案1】:

当您从 IDLE 运行脚本时,您无法在 sys.argv 中传递参数。所以在那个用例中,错误是正常的。但是在F5出现错误后,您应该可以直接调用:

zip_file = 'RegPlusExtract_November_2015.zip'
import_zip(zip_file)

它应该允许您处理您的数据。

对于命令提示符的第二种方式,您必须给出脚本文件的确切名称。命令应该是:

python import.py RegPlusExtract_November_2015.zip

但无论如何,将自己的脚本和其他数据文件放在 Python 目录中是不好的C:\Python27 应该只包含来自初始 Python 发行版和其他通用实用程序的文件,而不是您的本地脚本。 通常的方法是将c:\Python添加到您的PATH环境中,并使用专用目录进行数据慈善处理

【讨论】:

  • 您好,非常感谢。我听起来很傻,但是“直接调用”是什么意思?我应该将其添加到导入文件中还是在 ISLE 中键入?我都试过了,得到了这个错误:NameError: name 'import_zip' is not defined
  • 但是,第二种方法有效。该脚本仅适用于 Python 2.7(我也安装了 3.5,并且已经卸载它)。在命令中,我也放了pathway(C:\python27\import/py ...),终于成功了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 2021-08-24
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多