【问题标题】:Write XML filename based of CSV cell Python基于 CSV 单元 Python 编写 XML 文件名
【发布时间】:2011-12-30 22:12:07
【问题描述】:

尝试将此脚本的输出保存到基于 csv 中的单元格的文件中。我可以调用变量{file_root_name} 来写入xml 文件,但不能作为变量来写入文件名。如何使用变量file_root_name作为变量生成文件名?

import csv
import sys

from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement, Comment, tostring

from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="  ", encoding = 'utf-8')

doctype = '<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">'

video_data = ((256, 336000),
              (512, 592000),
              (768, 848000),
              (1128, 1208000))

with open(sys.argv[1], 'rU') as f:
    reader = csv.DictReader(f)
    for row in reader:
        root = Element('smil')
        root.set('xmlns', 'http://www.w3.org/2001/SMIL20/Language')
        head = SubElement(root, 'head')
        meta = SubElement(head, 'meta base="rtmp://cp23636.edgefcs.net/ondemand"')
        body = SubElement(root, 'body')

        switch_tag = ElementTree.SubElement(body, 'switch')

        for suffix, bitrate in video_data:

            attrs = {'src': ("mp4:soundcheck/{year}/{id}/{file_root_name}_{suffix}.mp4"
                             .format(suffix=str(suffix), **row)),
                     'system-bitrate': str(bitrate),
                     }
            ElementTree.SubElement(switch_tag, 'video', attrs)

        xml, doc = prettify(root).split('\n', 1)
        output = open('file_root_name'+'.smil', 'w')
        output.write(xml + doctype + doc)
        output.close

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我不确定我是否遵循,但如果这条线

      attrs = {'src': ("mp4:soundcheck/{year}/{id}/{file_root_name}_{suffix}.mp4"
                                 .format(suffix=str(suffix), **row)),
                         'system-bitrate': str(bitrate),
                         }
    

    有效,那么“file_root_name”必须是 dictlike 对象行的字符串键。线

        output = open('file_root_name'+'.smil', 'w')
    

    实际上将 字符串 'file_root_name' 与 '.smil' 组合在一起。所以你真的想要类似的东西

        output = open(row['file_root_name']+'.smil', 'w')
    

    顺便说一句,这条线

        output.close
    

    不会做任何事情——你想要 output.close() 代替,或者干脆

    with open(row['file_root_name']+'.smil', 'w') as output:
        output.write(xml + doctype + doc)
    

    【讨论】:

    • 这条线可以工作,但是如果我尝试print file_root_name,我会得到NameError: name 'file_root_name' is not defined 所以虽然它在attrs 中工作,但它不能作为变量工作。
    • 它不起作用,因为它不是变量。 'file_root_name' 是行字典中的一个键,具有一些关联的值(比如“fred”)。不过,如果你想要一个,只需使用file_root_name = row["file_root_name"]
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多