import csv
import random


class XmlFormat(object):
def __init__(self):
self.wf = open('data/res_location.xml', 'w', encoding='utf-8')
self.add_header()

def add_header(self):
header = """<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
"""
# print(header)
self.wf.write(header)

def add_tail(self):
tail = """
</data>
</odoo>
"""
self.wf.write(tail)

def get_random(self):
return random.randrange(1000, 9999, 1)

def readfile(self):
with open('data/location.csv', 'r', encoding='utf-8') as f:
reder = csv.reader(f, delimiter=',')
for i, line in enumerate(reder):
if not line:
continue
# todo: 自动抓取表头信息,并设置键值对:
if i == 0:
# 存储表头字段
if not line:
raise
header_line = line
continue
data = {}
# print(line)
# 处理每一行的数据
for e, var in enumerate(line):
# print(e,var,header_line[e])
if header_line[e] == 'new-code':
data[header_line[e]] = var or self.get_random()
elif header_line[e] == 'is_warehouse':
data[header_line[e]] = var or 0
else:
data[header_line[e]] = var

if (i) % 1000 == 0:
# 关闭之前的文件
self.add_tail()
self.wf.close()
self.wf = open('data/res_location.xml'.format(i), 'w', encoding='utf-8')
print('\'data/res_location{}.xml\','.format(i))
self.add_header()
# 这里传递参数的方式可以使用**kw
self.generate_xml_code(**data)

def generate_xml_code(self, **kwargs):
"""
设置xml 模板,并生成相应的xml文本,
大括号中的参数需要和csv 文件的字段信息保持一致,如{extra_id} 对应csv 文件中的extra_id字段
xml 模板按照可按照自己的需求进行更换.
注: csv 文件的字段不能重复.
:param kwargs:
:return:
"""
str_format = """
<record id="{extra_id}" model="stock.location">
<field name="name">{name}</field>
<field name="usage">internal</field>
<field name="is_warehouse">{is_warehouse}</field>
<field name="active">1</field>
<field name="company_id" ref="base.main_company"/>
<field name="location_id" ref="{extra_id_parent}"/>
<field name="barcode">{new-code}</field>
</record>
"""
res = str_format.format(**kwargs)
self.wf.write(res)

def __del__(self):
self.add_tail()

self.wf.close()


if __name__ == '__main__':
a = XmlFormat()
a.readfile()

说明:

  1. csv文件需要放在data文件夹中,其实可以修改读取文件的位置

懂得,原来世界如此简单!