2

私が作成したプログラムは、xml ファイルを解析し、解析データをデータベースに配置するために使用されます。私のコードは現在問題なく実行されていますが、私のインストラクターは私のコードにコメントを持っています.ところで、これは私のコードです:

import os
import time
import MySQLdb
import ConfigParser
import elementtree.ElementTree as ET


def update_database(article_code, date_received, s100rsd, remark_text, db):
    cur = db.cursor()
    try:
        cur_query = cur.execute("""INSERT INTO tblS100CurrentListing """
                                """(article_Code, dateReceived, s100RSD, remarks) VALUES (%s, %s, %s, %s) """
                                """ON DUPLICATE KEY UPDATE revisedRSD = %s, remarks = %s """,
                                (article_code, date_received, s100rsd, remark_text, s100rsd, remark_text))
        db.commit()
    except MySQLdb.Error, e:
        print "An error has been passed %s" %e
        db.rollback
    rows_affected = cur.rowcount
    if rows_affected > 0:
        print "Changes made in the database"
    else:
        print "Nothing is change in  the database"


def parse_xml(source_path, xml_file):
    # Alvin: !!! globals?
    global article_code
    global date_received
    global s100rsd
    global remark_text
    article_code = xml_file.split('.')[0]
    tree = ET.parse(xml_file)
    root = tree.getroot()
    order = root.find('order')
    order_time = order.find('time')
    year = order_time.attrib['yr']
    month = order_time.attrib['month']
    day = order_time.attrib['day']
    hour = order_time.attrib['hr']
    min = order_time.attrib['min']
    sec = order_time.attrib['sec']
    date_received = year +  month + day +  hour + min + sec
    due_date = order.find('due-date')
    due_date_time = due_date.find('time')
    yr = due_date_time.attrib['yr']
    month = due_date_time.attrib['month']
    day = due_date_time.attrib['day']
    s100rsd = "%s-%s-%s" %(yr, month, day)
    item_info = order.find('item-info')
    item_remarks = item_info.find('item-remarks')
    item_remark_list = item_remarks.findall('item-remark')
    item_remark_len = len(item_remark_list) - 1
    item_remark = item_remark_list[item_remark_len]
    remark = item_remark.find('remark')
    remark_text = remark.text


def main():
    config = ConfigParser.ConfigParser()
    config.readfp(open('part4b.ini'))
    server = config.get('main', 'Server')
    port = config.get('main', 'Port')
    port = int(port)
    schema = config.get('main', 'Schema') 
    table = config.get('main', 'Table')
    user = config.get('main', 'User')
    password = config.get('main', 'Password')
    source_path = config.get('main', 'filepath')

    db = MySQLdb.connect(server, user, password, schema, port)
    xml_list = os.listdir(source_path)
    for xml_file in xml_list:
        if xml_file.endswith('.xml'):
            parse_xml(source_path, xml_file)
            update_database(article_code, date_received, s100rsd, remark_text, db)

    db.close()

    print "This will close after 2 seconds . ."
    time.sleep(2)


if __name__ == '__main__':
    main()

parse_xml 関数で、彼は私がグローバル変数を使用することを望んでいません。これらの変数をグローバルとして宣言せずにメインで使用するにはどうすればよいですか?

ご助力いただきありがとうございます。

4

2 に答える 2

4

関数からそれらを返します

例えば

return article_code, date_received, s100rsd, remark_text

これは実際には 4 つのアイテムを含む単一のタプルを返しています

このように反対側でそれらを抽出できます

article_code, date_received, s100rsd, remark_text = parse_xml(...)
于 2012-07-13T06:26:03.143 に答える
0

通常行うことは、「データ オブジェクト」、つまり関連データを含むオブジェクトを返すことです。

class dto(object):
  def __init__(self, **kw):
    self.__dict__.update(kw)

def parse_xml(source_path, xml_file):
    data = dto(article_code = '1234',
               date_received = 'abc',
               s100rsd = '%s-%s-%s' % ('ab', 'cd', 'efgh'),
               remark_text = 'eh5jhe5')
    return data

data = parse_xml('../', 'abc.xml')

その後、data.data_received期待どおりに使用してください。

また、あなたの行に注意してください

os.listdir(source_path)
...
if xml_file.endswith('.xml'):

と交換するのは本当にいいです

import glob
xml_list = glob.glob(os.path.join(source_path, '*.xml'))
于 2012-07-13T07:39:54.880 に答える