设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1891|回复: 5

[已解决] Python应用:编辑文件

[复制链接]

423

主题

0

好友

6497

积分

摄政王(Regent)

楚门尼亚摄政王

Rank: 5Rank: 5

UID
34622
经验
6184
金钱
988
魅力
313

晨星勇士 论坛捐助者

发表于 2017-1-31 15:38:04 |显示全部楼层
文明6官方文本修正项目碰到的问题:
汉化文本分成七个Excel表,需要合并成一个大表后把数据复制粘贴到XML文件中
普通操作是一个个复制粘贴
可以用以下程序自动化处理
  1. # mergeXlsx.py: 将多个Excel文件中的表合并为一个文件中的一个表
  2. import glob # 筛选文件的标准库
  3. import openpyxl # 处理Excel文件的第三方库

  4. def run(path):
  5.     # 获取原文件列表
  6.     oldFiles = glob.glob(path + '*.xlsx')
  7.     # 要保存的新文件
  8.     newFile = path + 'newFile.xlsx'
  9.     # 在内存中创建新工作簿和表
  10.     workbook = openpyxl.Workbook()
  11.     worksheet = workbook.active
  12.     # 遍历所有文件
  13.     for file in oldFiles:
  14.         print('打开:' + file)
  15.         # 载入文件数据
  16.         data = openpyxl.load_workbook(file)
  17.         # 遍历所有表
  18.         for sheet in data.worksheets:
  19.             # 遍历所有行(不含表头)
  20.             for row in sheet.iter_rows(min_row=2):
  21.                 # 获取行数值列表并添加到新工作表
  22.                 line = [col.value for col in row]
  23.                 worksheet.append(line)
  24.     # 额外添加5行数值到新工作表
  25.     fixData = [['LOC_OPTIONS_KEY_0', '0'],
  26.                ['LOC_OPTIONS_KEY_QUOTE', '"'],
  27.                ['LOC_DIPLO_KUDO_EXIT_ANY_ANY', ' '],
  28.                ['LOC_DIPLO_WARNING_EXIT_ANY_ANY', ' '],
  29.                ['LOC_CREDITS', '....']]
  30.     for i in fixData:
  31.         worksheet.append(i)
  32.     # 保存新工作簿
  33.     print('保存:' + newFile)
  34.     workbook.save(newFile)
  35.     print('完工!')

  36. run('D:\\Test\\Civ6_Text\\Civ6.zh_CN\\')
复制代码
参考链接:
http://www.10tiao.com/html/383/201607/2247483697/1.html
但凡真金不久留 Nothing gold can stay

423

主题

0

好友

6497

积分

摄政王(Regent)

楚门尼亚摄政王

Rank: 5Rank: 5

UID
34622
经验
6184
金钱
988
魅力
313

晨星勇士 论坛捐助者

发表于 2017-1-31 19:00:00 |显示全部楼层
更好的做法是直接用Excel文件中的数据更新XML文件,但这还不知怎么实现,一起来讨论吧
但凡真金不久留 Nothing gold can stay
回复

使用道具 举报

423

主题

0

好友

6497

积分

摄政王(Regent)

楚门尼亚摄政王

Rank: 5Rank: 5

UID
34622
经验
6184
金钱
988
魅力
313

晨星勇士 论坛捐助者

发表于 2017-2-9 17:32:15 |显示全部楼层
将文明6英文版全部XML合并为一个的脚本
  1. # mergeXml.py: 将Civ6原文本所有XML文件合并为一个
  2. import glob # 筛选文件的标准库
  3. import xml.etree.ElementTree as ET # 处理XML文件的标准库

  4. def run(files):
  5.     xml_files = glob.glob(files +"*.xml")
  6.     xml_et = None
  7.     for xml_file in xml_files:
  8.         print('打开:' + xml_file)
  9.         data = ET.parse(xml_file).getroot()
  10.         for result in data.iter('BaseGameText'):
  11.             if xml_et is None:
  12.                 xml_et = data
  13.                 insertion_point = xml_et.findall("./BaseGameText")[0]
  14.             else:
  15.                 insertion_point.extend(result)
  16.         for result2 in data.iter('EnglishText'):
  17.             insertion_point.extend(result2)
  18.         for result3 in data.iter('FrontEndText'):
  19.             insertion_point.extend(result3)

  20.     if xml_et is not None:
  21.         f =  open("newFile.xml", "wb")
  22.         f.write(ET.tostring(xml_et))

  23.     print('完工!')

  24. run("D:\\Test\\Civ6_Text\\text.20161221\\en_US\\")
复制代码
但凡真金不久留 Nothing gold can stay
回复

使用道具 举报

423

主题

0

好友

6497

积分

摄政王(Regent)

楚门尼亚摄政王

Rank: 5Rank: 5

UID
34622
经验
6184
金钱
988
魅力
313

晨星勇士 论坛捐助者

发表于 2017-2-22 13:26:07 |显示全部楼层
上帖代码的一点小改进:
  1. def sortchildrenby(parent, attr): # 按属性值排序的函数
  2.     parent[:] = sorted(parent, key=lambda child: child.get(attr))

  3. def run(files):
  4. ...
  5.         for result3 in data.iter('FrontEndText'):
  6.             if result3.find('Row').attrib['Tag'] != 'LOC_CREDITS_BACK_BUTTON': # Credits.xml的两行不放进去(开发人员名单)
  7.                 insertion_point.extend(result3)

  8.     if xml_et is not None:
  9.         for child in xml_et:
  10.             sortchildrenby(child, 'Tag') # 按条目ID排序,方便新旧版本比对
  11.         f =  open("newFile.xml", "wb")
  12.         f.write(ET.tostring(xml_et))

  13.     print('完工!')
复制代码
参考链接
http://stackoverflow.com/questio ... xml-in-python-etree
https://docs.python.org/3.6/library/xml.etree.elementtree.html
https://docs.python.org/3.6/howto/sorting.html#sortinghowto
但凡真金不久留 Nothing gold can stay
回复

使用道具 举报

5#
无效楼层,该帖已经被删除

423

主题

0

好友

6497

积分

摄政王(Regent)

楚门尼亚摄政王

Rank: 5Rank: 5

UID
34622
经验
6184
金钱
988
魅力
313

晨星勇士 论坛捐助者

发表于 2017-4-15 21:18:32 |显示全部楼层
研究出用excel内容更新xml了,python很管用
  1. ''' updateXml.py 将Civ6内容包文本XML用Excel中的修正文本替换
  2. '''
  3. import os # 操作系统标准库
  4. import xml.etree.cElementTree as ET # 处理XML文件的标准库,C语言版更快
  5. import openpyxl # 处理Excel文件的第三方库

  6. folder = 'D:\\Test\\Civ6_Text\\civ6v100129.zh_cn_fix.20170415\\'

  7. # 读取Excel文件建立修正文本词典
  8. print('建立词典……')
  9. wb = openpyxl.load_workbook(folder + 'y_DLC.xlsx')
  10. sheet = wb.get_sheet_by_name('Sheet1')
  11. dict = {}
  12. for row in sheet.iter_rows(min_row=2):
  13.     # 词条ID及修正文本对
  14.     txtID = row[1].value
  15.     txtCN = row[3].value
  16.     dict.setdefault(txtID, txtCN)

  17. # 遍历内容包所有文本XML,查词典替换
  18. for foldername, subfoldername, filenames in os.walk(folder + 'DLC'):
  19.     for filename in filenames:
  20.         print('打开文件:' + filename)
  21.         tree = ET.ElementTree(file=foldername+'\\'+filename)
  22.         root = tree.getroot()
  23.         for result in root.iter('LocalizedText'):
  24.             for row in result:
  25.                 if row.attrib['Language'] == 'zh_Hans_CN':
  26.                     row[0].text = dict[row.attrib['Tag']]
  27.         #保存文件
  28.         print('保存文件:' + filename)
  29.         open(foldername+'\\'+filename, 'wb').write(ET.tostring(root, encoding='utf8', method='xml'))
  30. print('完工!')
复制代码
但凡真金不久留 Nothing gold can stay
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|塞爱维(CIV)文明联盟    

GMT+8, 2019-10-21 16:12

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部