使用Python,在Excel文件中获取一行中单元格的值,其中同一行中的单元格包含来自xml文件的字符串

问题描述 投票:0回答:1

我有几个 xml 文件,其名称如下:

LLL_ABC0D012_title.xml

LLL_ABC0D013_title.xml

LLL_ABT0G012_title.xml

LLL_ABR0N012_title.xml

“LLL_”后面始终有 8 个字符。

我有一个包含 900 多行的 Excel 文件,如下所示:

参考 dtp1 dtp2 dtp3
ABC0D012 1_blabla 1_1_blablabla 1_1_1_blablablabla
ABC0D013 1_blabla 1_1_blablabla 1_1_1_blablablabla
ABC0D014 1_blabla 1_1_blablabla 1_1_1_blablablabla
ABT0G012 1_blabla 1_1_blablabla 1_1_1_blablablabla

在我的 xml 文件中,我有 texttexttext 标签。 我想用上表中相应列的单元格中的文本修改这些标签的文本。

为此,我希望我的脚本执行一个循环,读取 xml 文件标题中的 ABC0D012 字符(然后是其他字符),在 Excel 文件的“引用”列中找到匹配项,然后查找相应的“dtp1”、“dtp2”和“dtp3”中的值。 然后我想将这些值保存在变量中以替换标签中的文本。

我是Python初学者。我尝试过类似的事情:

import numpy as np
import openpyxl
import pandas as pd
import xml.etree.ElementTree as ET
import os

table1 = pd.read_excel('C:/Users/Documents/datatypes.xlsx', na_values=['NA'])
table2 = table1.replace('\xa0', ' ',regex=True)

for root, dirs, files in os.walk("."):
    for file in files :
        if file[-4:] == '.xml':
            #print(file)
            xml = ET.parse('LLL_ABC0D012_title.xml')
            root = xml.getroot()
            dtp1_xml = root[8]
            dtp2_xml = root[9]          
            dtp3_xml = root[10]
            num = file[4:12]
            #print(num)
            dtp1_excel = table2['dtp1'].where(table2['reference'] == num)
            dtp1_xml.text = dtp1_excel
            #print(dtp1_xml.text)
            ET.indent(root)
            xml.write("LLL_ABC0D012_title.xml", encoding='utf-8', xml_declaration=True, method='xml')

但它不起作用,“dtp1_excel”不会从打印函数中的表中返回 dtp1 值,而是类似:

0      NaN
1      NaN
2      NaN
3      NaN
4      NaN
      ...
931    NaN
932    NaN
933    NaN
934    NaN
935    NaN
Name: dtp1, Length: 936, dtype: object

我在引用和 dtp1 列中没有 NaN 值,它应该只返回单个单元格值。

我的方法有什么问题吗?你能帮我吗?

python excel pandas xml tags
1个回答
0
投票

主要问题是

.where()
返回所有行
它将
NaN
放入不匹配的行中,并将值保留在匹配的行中。

例如

import pandas as pd

data = {
    'X': ['A','B','C'], 
    'Y': ['D','E','F'], 
    'Z': ['G','H','I']
}

df = pd.DataFrame(data)

df['X'].where(df['Y'] == 'E')
给出

0    NaN
1      B
2    NaN
Name: X, dtype: object

但是

df['X'][df['Y'] == 'E']
给出

1    B
Name: X, dtype: object

但是两者都给出了Series,它仍然需要使用

[index]
.iloc[row_number]
来获取值

results = df['X'][df['Y'] == 'E']
print(results[1])       # row's index is `1`
print(results.iloc[0])  # row's numer is `0`

完整的工作示例:

import pandas as pd

data = {
    'X': ['A','B','C'], 
    'Y': ['D','E','F'], 
    'Z': ['G','H','I']
}

df = pd.DataFrame(data)

print('---')
print(df)

print("--- [df['Y'] == 'E'] ---")
results = df['X'][df['Y'] == 'E']
print(results)
print('type:', type(results))

print("--- .where(df['Y'] == 'E') ---")
results = df['X'].where(df['Y'] == 'E')
print(results)
print('type:', type(results))

results = df['X'][df['Y'] == 'E']

print("---")
print('     [1]:', results[1])
print('.iloc[0]:', results.iloc[0])
© www.soinside.com 2019 - 2024. All rights reserved.