看过来
《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
,可选。None
widths
,则 colspecs
将被忽略。每个整数表示对应列的字符宽度。也可以使用浮点数表示相对宽度。infer_nrows
int
,可选。100
dtype_backend
str
或 _NoDefault
_NoDefault.no_default
iterator
bool
,可选。False
True
,则返回一个 TextFileReader
对象,可以逐块读取大型文件,适用于内存受限的情况。chunksize
int
,可选。None
chunksize
,可以逐步读取和处理数据,而无需一次性将整个文件加载到内存中。**kwds
read_csv
函数的其他参数,例如 header
、names
、index_col
、dtype
、parse_dates
等,用于进一步控制数据的读取方式。pandas.DataFrame
或 TextFileReader
DataFrame
对象,便于后续的数据分析和处理。如果设置了 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