You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:28:24