解析.ts文件提取字符串写入Excel列失败,求迭代行列写入方法
解决.ts文件字符串提取后Excel无内容的问题,以及手动控制行列写入的方法
嘿,我来帮你搞定这个问题!首先咱们先分析下你现有代码为什么会出现Excel无内容的情况,然后再给出修复方案,顺便教你怎么手动指定行列号来写入数据。
问题根源:循环内重复初始化导致内容被覆盖
你代码里的核心问题是在for循环的每次迭代中,都重新创建了pd.ExcelWriter和只包含当前字符串的DataFrame,然后立刻调用save()。这就意味着:
- 每次循环都会把之前的Excel文件完全覆盖掉
- 如果最后一次循环的写入操作因为某种原因失效(比如字符串为空),最终的Excel就会是空的
- 单独的DataFrame每次只写入一行,完全没有保留之前的内容
另外,虽然你设置了sys.setdefaultencoding('utf-8'),但在Python2里这个操作可能会和pandas的编码处理产生冲突,不过这不是导致空文件的直接原因。
修复方案1:先收集所有字符串,一次性写入Excel
这种方法更高效,也符合pandas的使用习惯,先把所有提取到的字符串收集到列表里,再统一生成DataFrame写入Excel:
from xml.dom import minidom import sys import pandas as pd import xlsxwriter # Python2专属编码设置,Python3可以直接删除下面两行 reload(sys) sys.setdefaultencoding('utf-8') def main(): doc = minidom.parse("english.ts") # 先创建一个列表,用来存储所有提取到的字符串 extracted_strings = [] messages = doc.getElementsByTagName("message") for message in messages: source_node = message.getElementsByTagName("source")[0] # 加个判断,避免节点没有文本内容时报错 if source_node.firstChild: ori_string = source_node.firstChild.data print(ori_string) extracted_strings.append(ori_string) # 用收集到的列表生成DataFrame,一次性写入Excel df = pd.DataFrame({'TString': extracted_strings}) with pd.ExcelWriter('new.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='Sheet1', index=False) # index=False去掉默认的行号列 if __name__ == '__main__': main()
这里用了with语句来管理ExcelWriter,不需要手动调用save(),更安全也更简洁。
修复方案2:手动指定行列号逐行写入
如果你需要更精细地控制每个单元格的位置(比如指定写入第N行第M列),可以直接使用xlsxwriter的原生API,跳过pandas的DataFrame:
from xml.dom import minidom import sys import xlsxwriter # Python2专属编码设置,Python3可删除 reload(sys) sys.setdefaultencoding('utf-8') def main(): doc = minidom.parse("english.ts") # 创建Excel工作簿和工作表 workbook = xlsxwriter.Workbook('new.xlsx') worksheet = workbook.add_worksheet('Sheet1') # 先写入表头(可选),A1单元格对应行号0、列号0 worksheet.write(0, 0, 'TString') # 从第2行开始写入数据(行号从0开始计数,所以row=1对应Excel的第2行) current_row = 1 messages = doc.getElementsByTagName("message") for message in messages: source_node = message.getElementsByTagName("source")[0] if source_node.firstChild: ori_string = source_node.firstChild.data print(ori_string) # 写入指定行列:current_row行,0列(对应Excel的A列) worksheet.write(current_row, 0, ori_string) current_row += 1 # 写完一行后,行号自增 # 关闭工作簿,完成写入 workbook.close() if __name__ == '__main__': main()
关键点说明:
worksheet.write(row, col, value)里的row和col都是从0开始计数的,比如write(0, 0, '文本')就是写入Excel的A1单元格- 手动控制行号可以灵活调整写入位置,比如你想写入B列就把
col改成1,想从第5行开始写就把current_row初始值设为4 - 加入
if source_node.firstChild:的判断,能避免遇到空的<source>节点时抛出异常
内容的提问来源于stack exchange,提问作者griez007
相关产品推荐
相关产品推荐

