pandas.read_xml#

pandas.read_xml(path_or_buffer, *, xpath='./*', namespaces=None, elems_only=False, attrs_only=False, names=None, dtype=None, converters=None, parse_dates=None, encoding='utf-8', parser='lxml', stylesheet=None, iterparse=None, compression='infer', storage_options=None, dtype_backend=_NoDefault.no_default)[源代码]#

将 XML 文档读取到 DataFrame 对象中。

在 1.3.0 版本加入.

Parameters:
path_or_buffer字符串、路径对象或文件类对象

字符串、路径对象(实现 os.PathLike[str])或实现 read() 函数的文件类对象。字符串可以是任何有效的 XML 字符串或路径。字符串还可以是 URL。有效的 URL 方案包括 http、ftp、s3 和 file。

自 2.1.0 版本弃用: 传递 XML 字面量字符串已弃用。请改为使用 io.StringIOio.BytesIO 包装字面量 XML 输入。

xpathstr, optional, default ‘./*’

用于解析所需节点集合以迁移到 DataFrameXPathXPath 应返回元素集合而不是单个元素。注意:etree 解析器支持有限的 XPath 表达式。对于更复杂的 XPath,请使用需要安装的 lxml

namespacesdict, 可选

XML 文档中定义的命名空间以字典的形式给出,键是命名空间前缀,值是 URI。XML 中不需要包含所有命名空间,只需包含 xpath 表达式中使用的命名空间。注意:如果 XML 文档使用未带前缀的默认命名空间(表示为 xmlns=’<URI>’),则必须为该 URI 分配一个临时的命名空间前缀(如 ‘doc’),以便解析底层节点和/或属性。例如:

namespaces = {"doc": "https://example.com"}
elems_only布尔值,可选,默认为 False

仅解析指定 xpath 下的子元素。默认情况下,返回所有子元素和非空文本节点。

attrs_only布尔值,可选,默认为 False

仅解析指定 xpath 下的属性。默认情况下,返回所有属性。

names类列表,可选

用于解析 XML 数据的 DataFrame 的列名。使用此参数可重命名原始元素名称,并区分同名的元素和属性。

dtype类型名称或字典(列 -> 类型),可选

数据或列的数据类型。例如:{‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’}。使用 strobject 并结合恰当的 na_values 设置来保留数据且不进行解释。如果指定了 converters,则它们将*代替* dtype 转换。

在 1.5.0 版本加入.

convertersdict, 可选

用于转换特定列值的函数字典。键可以是整数或列标签。

在 1.5.0 版本加入.

parse_dates布尔值、整数列表、名称列表、列表的列表或字典,默认为 False

用于解析索引或列为日期的标识符。行为如下:

  • 布尔值。如果为 True -> 尝试解析索引。

  • 整数或名称列表。例如:如果为 [1, 2, 3] -> 尝试将第 1、2、3 列各自解析为单独的日期列。

  • 列表的列表。 例如:如果为 [[1, 3]] -> 将第 1 列和第 3 列合并并解析为单个日期列。

  • 字典。例如:{‘foo’ : [1, 3]} -> 将第 1 列和第 3 列解析为日期,并将结果命名为 ‘foo’。

在 1.5.0 版本加入.

encodingstr, optional, default ‘utf-8’

XML 文档的编码。

parser{‘lxml’,’etree’},默认值为 ‘lxml’

用于检索数据的解析器模块。仅支持 ‘lxml’ 和 ‘etree’。使用 ‘lxml’ 可以支持更复杂的 XPath 搜索,并且能够使用 XSLT 样式表。

stylesheetstr、path 对象或文件类对象

包含 XSLT 脚本的 URL、文件类对象或原始字符串。此样式表应将复杂的、深度嵌套的 XML 文档展平,以便于解析。要使用此功能,必须安装 lxml 模块,并将 parser 指定为 ‘lxml’。xpath 必须引用 XSLT 转换后生成的 XML 文档的节点,而不是原始 XML 文档。目前仅支持 XSLT 1.0 脚本,不支持更高版本。

iterparsedict, 可选

在 XML 文档的迭代解析中要检索的节点或属性,以字典形式给出。键是重复元素的名称,值是该重复元素下方的元素或属性名称列表。注意:如果使用此选项,它将*取代* xpath 解析。与 xpath 不同,后代节点不必彼此相关,而是可以存在于重复元素下的文档中的任何位置。这种内存高效的方法应用于非常大的 XML 文件(500MB、1GB 或 5GB 以上)。例如:

iterparse = {"row_element": ["child_elem", "attr", "grandchild_elem"]}

在 1.5.0 版本加入.

compressionstr or dict, default ‘infer’

用于对磁盘上的数据进行即时解压缩。如果为 ‘infer’ 且 ‘path_or_buffer’ 是类路径,则根据以下扩展名检测压缩:’.gz’, ‘.bz2’, ‘.zip’, ‘.xz’, ‘.zst’, ‘.tar’, ‘.tar.gz’, ‘.tar.xz’ 或 ‘.tar.bz2’(否则不压缩)。如果使用 ‘zip’ 或 ‘tar’,ZIP 文件中只能包含一个要读取的数据文件。设置为 None 则不进行解压缩。也可以是字典,其中键 'method' 设置为 {'zip', 'gzip', 'bz2', 'zstd', 'xz', 'tar'} 之一,其他键值对将转发给 zipfile.ZipFilegzip.GzipFilebz2.BZ2Filezstandard.ZstdDecompressorlzma.LZMAFiletarfile.TarFile。例如,可以为使用自定义压缩字典的 Zstandard 解压缩传递以下参数:compression={'method': 'zstd', 'dict_data': my_compression_dict}

在 1.5.0 版本加入: 增加了对 .tar 文件的支持。

在 1.4.0 版本发生变更: Zstandard 支持。

storage_optionsdict, 可选

适用于特定存储连接的额外选项,例如主机、端口、用户名、密码等。对于 HTTP(S) URL,键值对将作为标头选项转发给 urllib.request.Request。对于其他 URL(例如,以 “s3://”, 和 “gcs://” 开头的 URL),键值对将转发给 fsspec.open。更多详情请参阅 fsspecurllib,有关存储选项的更多示例,请参阅 here

dtype_backend{‘numpy_nullable’, ‘pyarrow’}, 默认 ‘numpy_nullable’

应用于结果 DataFrame 的后端数据类型(仍处于实验阶段)。行为如下:

  • "numpy_nullable":返回支持可空 dtype 的 DataFrame (默认)。

  • "pyarrow":返回 pyarrow 支持的可空 ArrowDtype DataFrame。

在 2.0 版本加入.

Returns:
df

一个 DataFrame。

参见

read_json

将 JSON 字符串转换为 pandas 对象。

read_html

将 HTML 表格读取为 DataFrame 对象列表。

Notes

此方法最适合导入以下格式的浅层 XML 文档,这种格式非常适合 DataFrame 的二维结构(行与列)。

<root>
    <row>
      <column1>data</column1>
      <column2>data</column2>
      <column3>data</column3>
      ...
   </row>
   <row>
      ...
   </row>
   ...
</root>

作为一种文件格式,XML 文档的设计方式可以有多种,包括元素和属性的布局,只要它符合 W3C 规范即可。因此,此方法是一个便捷的处理器,用于处理特定的扁平化设计,而不是处理所有可能的 XML 结构。

然而,对于更复杂的 XML 文档,stylesheet 允许您使用 XSLT(一种专用语言)临时重新设计原始文档,以得到一个更扁平化的版本,方便迁移到 DataFrame。

此函数将*始终*返回单个 DataFrame 或因 XML 文档、xpath 或其他参数问题而引发异常。

有关使用此方法将 XML 文件解析到 DataFrame 的更多信息,请参阅文档 IO 部分的 read_xml documentation in the IO section of the docs

Examples

>>> from io import StringIO
>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <data xmlns="http://example.com">
...  <row>
...    <shape>square</shape>
...    <degrees>360</degrees>
...    <sides>4.0</sides>
...  </row>
...  <row>
...    <shape>circle</shape>
...    <degrees>360</degrees>
...    <sides/>
...  </row>
...  <row>
...    <shape>triangle</shape>
...    <degrees>180</degrees>
...    <sides>3.0</sides>
...  </row>
... </data>'''
>>> df = pd.read_xml(StringIO(xml))
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0
>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <data>
...   <row shape="square" degrees="360" sides="4.0"/>
...   <row shape="circle" degrees="360"/>
...   <row shape="triangle" degrees="180" sides="3.0"/>
... </data>'''
>>> df = pd.read_xml(StringIO(xml), xpath=".//row")
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0
>>> xml = '''<?xml version='1.0' encoding='utf-8'?>
... <doc:data xmlns:doc="https://example.com">
...   <doc:row>
...     <doc:shape>square</doc:shape>
...     <doc:degrees>360</doc:degrees>
...     <doc:sides>4.0</doc:sides>
...   </doc:row>
...   <doc:row>
...     <doc:shape>circle</doc:shape>
...     <doc:degrees>360</doc:degrees>
...     <doc:sides/>
...   </doc:row>
...   <doc:row>
...     <doc:shape>triangle</doc:shape>
...     <doc:degrees>180</doc:degrees>
...     <doc:sides>3.0</doc:sides>
...   </doc:row>
... </doc:data>'''
>>> df = pd.read_xml(StringIO(xml),
...                  xpath="//doc:row",
...                  namespaces={"doc": "https://example.com"})
>>> df
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0
>>> xml_data = '''
...         <data>
...            <row>
...               <index>0</index>
...               <a>1</a>
...               <b>2.5</b>
...               <c>True</c>
...               <d>a</d>
...               <e>2019-12-31 00:00:00</e>
...            </row>
...            <row>
...               <index>1</index>
...               <b>4.5</b>
...               <c>False</c>
...               <d>b</d>
...               <e>2019-12-31 00:00:00</e>
...            </row>
...         </data>
...         '''
>>> df = pd.read_xml(StringIO(xml_data),
...                  dtype_backend="numpy_nullable",
...                  parse_dates=["e"])
>>> df
   index     a    b      c  d          e
0      0     1  2.5   True  a 2019-12-31
1      1  <NA>  4.5  False  b 2019-12-31