看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas.read_fwf() 是 Pandas 中用于读取固定宽度格式(Fixed Width Format, FWF)文本文件并将其转换为 DataFrame 的函数。固定宽度格式的文件中,每一列的数据占据固定的字符宽度,这种格式常用于旧式的数据库导出文件、日志文件或某些特定应用程序生成的数据文件。
pandas.read_fwf(
filepath_or_buffer,
*,
colspecs='infer',
widths=None,
infer_nrows=100,
dtype_backend=<no_default>,
iterator=False,
chunksize=None,
**kwds
)
filepath_or_buffer
str、pathlib.Path、file-like object、URL 等。colspecs
'infer' 或 list of pairs。'infer''infer',Pandas 将尝试自动推断列的边界。widths
list of int 或 list of float,可选。Nonewidths,则 colspecs 将被忽略。每个整数表示对应列的字符宽度。也可以使用浮点数表示相对宽度。infer_nrows
int,可选。100dtype_backend
str 或 _NoDefault_NoDefault.no_defaultiterator
bool,可选。FalseTrue,则返回一个 TextFileReader 对象,可以逐块读取大型文件,适用于内存受限的情况。chunksize
int,可选。Nonechunksize,可以逐步读取和处理数据,而无需一次性将整个文件加载到内存中。**kwds
read_csv 函数的其他参数,例如 header、names、index_col、dtype、parse_dates 等,用于进一步控制数据的读取方式。pandas.DataFrame 或 TextFileReaderDataFrame 对象,便于后续的数据分析和处理。如果设置了 iterator=True 或 chunksize,则返回一个 TextFileReader 对象,可以通过迭代器逐块读取数据。pandas.read_fwf() 主要用于读取固定宽度格式的文本文件。这种文件格式在以下场景中常见:
假设有一个名为 data.fwf 的文件,内容如下:
Name Age City
Alice 30 New York
Bob 25 Los Angeles
Charlie 35 Chicago
在这个文件中:
Name 占据 8 个字符宽度Age 占据 4 个字符宽度City 占据剩余的字符宽度import pandas as pd
# 读取固定宽度格式的文件,自动推断列宽
df = pd.read_fwf('data.fwf')
print(df)
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
2 Charlie 35 Chicago
如果知道每一列的具体宽度,可以通过 widths 参数指定:
import pandas as pd
# 指定每一列的宽度
widths = [8, 4, 12]
# 读取固定宽度格式的文件,指定列宽
df = pd.read_fwf('data.fwf', widths=widths)
print(df)
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
2 Charlie 35 Chicago
colspecs 指定列边界如果列的宽度不一致或包含特殊情况,可以使用 colspecs 参数指定每列的起始和结束位置:
import pandas as pd
# 指定每一列的起始和结束位置
colspecs = [(0, 8), (8, 12), (12, 24)]
# 读取固定宽度格式的文件,指定列边界
df = pd.read_fwf('data.fwf', colspecs=colspecs)
print(df)
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
2 Charlie 35 Chicago
假设有一个名为 data_missing.fwf 的文件,内容如下:
Name Age City
Alice 30 New York
Bob Los Angeles
Charlie 35 Chicago
在这个文件中,第二行的 Age 数据缺失。
import pandas as pd
# 读取包含缺失值的文件,并指定 Age 列为整数类型
df = pd.read_fwf('data_missing.fwf', widths=[8, 4, 12], na_values=[''])
print(df)
输出
Name Age City
0 Alice 30.0 New York
1 Bob NaN Los Angeles
2 Charlie 35.0 Chicago
对于非常大的固定宽度文件,可以使用 chunksize 参数逐块读取,以节省内存。
import pandas as pd
# 逐块读取固定宽度格式的文件,每次读取2行
chunk_iter = pd.read_fwf('large_data.fwf', widths=[8, 4, 12], chunksize=2)
for chunk in chunk_iter:
print(chunk)
# 在这里可以对每个块进行处理
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
Name Age City
0 Charlie 35 Chicago
假设有一个名为 data_comments.fwf 的文件,内容如下:
# This is a comment line
Name Age City
Alice 30 New York
Bob 25 Los Angeles
Charlie 35 Chicago
可以通过 skiprows 参数跳过注释行:
import pandas as pd
# 读取固定宽度格式的文件,跳过第一行注释
df = pd.read_fwf('data_comments.fwf', widths=[8, 4, 12], skiprows=1)
print(df)
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
2 Charlie 35 Chicago
当文件非常大时,可以使用 iterator=True 结合 chunksize 进行逐块读取:
import pandas as pd
# 使用迭代器逐块读取固定宽度格式的文件
reader = pd.read_fwf('large_data.fwf', widths=[8, 4, 12], iterator=True)
try:
while True:
chunk = reader.read(2) # 每次读取2行
print(chunk)
except StopIteration:
pass
输出
Name Age City
0 Alice 30 New York
1 Bob 25 Los Angeles
Name Age City
0 Charlie 35 Chicago
pandas.read_fwf() 是一个强大的工具,用于读取和解析固定宽度格式的文本文件。通过灵活设置 colspecs 或 widths 参数,结合其他参数如 skiprows、na_values、chunksize 等,可以高效地处理各种复杂的数据文件。在数据分析和预处理中,掌握 read_fwf 的使用方法能够显著提升数据读取和预处理的效率,特别是在处理传统数据文件或特定格式的数据源时。
更新时间:2024-10-10 08:41:19 标签:pandas python fwf