HOWTO · Pandas
Pandas 中如何从文本文件加载数据
本教程演示了 Pandas 中如何从文本文件加载数据,方法是使用 read_csv,read_fwf 和 read_table。
本页内容
.txt 扩展名并不能决定文件应如何解析。对于字段由分隔符隔开的文本,使用 read_csv();对于列按固定字符位置对齐的文本,使用 read_fwf();对于以制表符分隔的表格,使用 read_table()。这三种读取函数都会返回 pandas DataFrame。下面的示例会各自创建一个小型输入文件,让你能结合代码查看每种格式。
使用 read_csv() 读取分隔文本
当每条记录的字段都由一致的字符分隔(例如逗号或分号)时,可以使用 read_csv()。默认情况下,pandas 会将第一行视为列标题。如果文件没有标题行,请设置 header=None;也可以传入 names 指定列名。下面的示例使用带标题行、其中有一个空字段的逗号分隔文件:
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as folder:
path = Path(folder) / "people.txt"
path.write_text("name,age\nAda,36\nLinus,", encoding="utf-8")
df = pd.read_csv(path, sep=",")
print(df.to_string(index=False))
name age
Ada 36.0
Linus NaN
默认情况下,pandas 会识别常见的缺失值标记,包括空字段。使用 keep_default_na=False 可停用这些默认标记;使用 na_values 可添加适用于特定文件的标记。此处空白的年龄显示为 NaN;由于该列还包含缺失值,有值的年龄会被推断为浮点数。
使用 read_fwf() 读取固定宽度文本
当字段位于确定的字符位置、列之间没有分隔符时,可以使用 read_fwf()。它并不是用于处理分隔符不一致文件的通用读取函数。下面的示例明确指定列宽,以便清楚地标出字段边界:
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as folder:
path = Path(folder) / "people.txt"
path.write_text("Ada 036\nLinus 042\n", encoding="utf-8")
df = pd.read_fwf(path, widths=[6, 3], names=["name", "age"])
print(df.to_string(index=False))
name age
Ada 36
Linus 42
调整 widths,使其符合记录中各字段占用的字符范围;如果边界不明确,请先检查文件格式,再选择列宽。示例传入的 names 为解析出的两个字段指定列名,因此样例不需要标题行。
使用 read_table() 读取表格文本
read_table() 用于读取分隔数据,默认使用制表符作为分隔符。如果文件使用其他分隔符,请传入 sep。下面的示例使用默认的制表符分隔:
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as folder:
path = Path(folder) / "scores.txt"
path.write_text("name\tscore\nMina\t91\nOmar\t87\n", encoding="utf-8")
df = pd.read_table(path)
print(df.to_string(index=False))
name score
Mina 91
Omar 87
例如,对于以分号分隔的文件,可以传入 sep=";";分隔符必须与文件中的字符一致。与 read_csv() 一样,read_table() 默认将第一行作为标题;如果输入一开始就是数据行,设置 header=None 即可改变这一行为。
选择读取函数并处理常见选项
逗号分隔或其他使用统一分隔符的记录适合用 read_csv();字段按固定宽度对齐时用 read_fwf();制表符分隔的表格则可用 read_table()。对于分隔文本读取函数,pandas 默认会从第一行推断标题行;设置 header=None 可关闭此行为。文件没有标题行时,可以用 names=[...] 指定列名。使用 na_values 标记文件中特有的缺失值。read_fwf() 示例也接受 names,而 widths 参数用于描述各字段占用的字符范围。
要读取现有的 .txt 文件,请将文件路径传给读取函数,例如 pd.read_csv("/path/to/people.txt", sep=",")。在 Windows 上,像 r"C:\\data\\people.txt" 这样的原始字符串可以避免反斜杠被当作转义字符。在每个示例中,将临时文件的创建步骤和 path 值替换为自己的文件路径,保留读取函数调用,并根据文件格式选择相应的分隔符、标题行设置、列名或列宽。相对路径会以 Python 进程的当前工作目录为基准解析;如果该目录可能变化,请使用绝对路径。