Pandas 中的文件读取操作
Pandas 提供了强大的文件读取功能,支持多种格式的数据文件。
StringIO 模块
该模块允许在内存中像文件一样处理字符串数据。这个模块在不需要实际文件的情况下进行字符串的读写操作时特别有用。(适合测试和临时数据处理)
python3导入:
from io import StringIO # 用于字符串操作(Unicode)
from io import BytesIO # 用于字节操作
基本的读写
from io import StringIO
# 创建StringIO对象并写入数据
output = StringIO()
output.write('第一行文本\n')
output.write('第二行文本\n')
# 获取写入的内容
output.seek(0)
contents = output.read()
print(contents)
# 输出:
# """
# 第一行文本
# 第二行文本
# """
# 关闭对象
output.close()
与pandas结合使用
import pandas as pd
from io import StringIO
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
output = StringIO() # 创建一个空的类文件对象(相当于创建一个空文件),支持文本读写操作
df.to_csv(output) # 将DataFrame写入内存中的"文件"
csv_string = output.getvalue()
print(csv_string)
"""
,A,B
0,1,3
1,2,4
"""
output.close()
1. CSV 文件(pd.read_csv('file.csv')
)
读取CSV的操作和参数
import pandas as pd
# 基本读取
df = pd.read_csv('file.csv')
# 常用参数
df = pd.read_csv('file.csv',
sep=',', # 指定分隔符,默认为逗号。
header=0, # 指定哪行作为列名(默认为0,即第一行),设为none的话就是表明所有行都是数据
names=['col1', 'col2'], # 抛弃原有的列名,显示的时候显示指定的列名
index_col=0, # 抛弃原有的行索引,指定列作为行索引
usecols=[0, 2], # 读取指定的原始列,
dtype={'col1': str, 'col2': float}, # 指定列数据类型
na_values=['NA', 'null'], # 指定文件中的哪些值为NaN缺失值
keep_default_na=True # 自动将字符串中的控制解析为NAN
skiprows=[0, 2], # 跳过指定的行
encoding='utf-8') # 指定编码方式
nrows=100, # 只读取前100行
chunksize # 要逐块读取文件,可以用该参数指定每次读取的行数
parse_dates # 将指定列变成datetime64的格式
CSV文件参数的注意事项:
- 处理不同数量的空白字符间隔:
sep="\\s+"
- usecols:的参数需要是列表或可调用对象,不能直接传字符串
- dtype:支持字典形式为不同列指定不同类型,也支持单一类型应用于所有列,还可以使用NumPy或Pandas的特殊数据类型。
- skiprows:[0,2 ]跳过指定的第一行和第三行,单纯的数字2表示跳过前2行
- na_values参数可以指定为字典,字典的键对应表的列,可以针对各个列指定不同缺失值标识
- keep_default_na 和 na_values参数配合使用:设置为 keep_default_na = False 时,只有通过 na_values 参数明确指定的值才会被解析为 NaN
- chunksize参数:分块读取,使用该参数生成一个TextFileReader对象(相当于一个迭代器),可以被遍历,每次迭代指定行
将DataFrame数据存储成CSV文本格式
import pandas as pd
# 创建一个示例DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']
})
# 不同列使用不同的空值表示
df.to_csv('output.csv', na_rep={'Age': 'N/A', 'City': 'Unknown'})
常用参数及其注意事项
- sep/delimiter:指定分隔符(默认为逗号)
- header:是否写入列名(默认为True)
- index:是否写入行索引(默认为True)
- columns:指定要保存的列
- float_format:浮点数格式
- date_format:日期格式
- na_rep:缺失值表示(默认为空字符串)
- quoting:引用规则,
quoting=csv.QUOTE_NONNUMERIC
表示非数字值加引号;quoting=csv.QUOTE_ALL
表示所有字段加引号 - quotechar:引用字符(默认为双引号")
- mode:设置写入的模式,是w覆盖写还是a追加写
2. JSON 文件和DataFrame之间的转换(read_json()
\ to_json()
)
- 除了空值null和一些其他的细微差别(列表某尾不允许存在多余的逗号),JSON非常接近python代码。
JSON的基本类型:字典,列表,字符串,数值,布尔值以及空值
对象中所有的键必须是字符串 pd.read_json(文件路径/文件对象,参数)
:将json格式转化成指定形式的Series或DataFramedf.to_json(文件路径/文件对象,参数)
:将数据转换成JSON格式的文件
import json
result = json.loads(obj) # json——>python
asjson = json.dumps(result) # python——>json
# 读取JSON文件为pandas数据类型
df = pd.read_json('file.json',
orient='records', # 设置展现方向JSON格式方向
lines=True, # 每行一个JSON对象
dtype={'id': str}) # 指定数据类型
# 从JSON字符串创建
json_str = '{"name":{"0":"Alice","1":"Bob"},"age":{"0":25,"1":30}}'
df = pd.read_json(json_str)
3. Excel 文件读取和写入(read_excel()
、to_excel()
)
读取
pd.ExcelFile()
:将文件转换成pandas.io.excel._base.ExcelFile对象,获取其中的数据需要parse()函数进行解析pandas.read_excel()
:直接获取解析原始数据,相当于ExcelFile.parse()
# 读取Excel文件
df = pd.read_excel('file.xlsx',
sheet_name='Sheet1', # 指定工作表
header=0, # 指定标题行
usecols='A:C,E', # 选择指定列
dtype={'列名1': str}) # 指定列数据类型
# 读取多个sheet
with pd.ExcelFile('file.xlsx') as xls:
df1 = pd.read_excel(xls, sheet_names = 'Sheet1')
xls.parse(sheet_names = 'Sheet1' ) # 这两句话表示的意思相同
写入
pd.ExcelWriter()
:用于将 DataFrame 数据写入 Excel 文件(.xlsx, .xls 等格式)。它支持多 Sheet 写入、格式控制(如引擎选择、日期格式等),并且通常与 with 语句一起使用,确保文件正确保存和关闭。- mode:写入模式
- date_format 设置日期格式(如 “YYYY-MM-DD”)
- datetime_format 设置日期时间格式(如 “YYYY-MM-DD HH:MM:SS”)
- float_format 设置浮点数格式(如 “%.2f” 保留两位小数)
- encoding 文件编码(如 “utf-8”)
pandas.to_excel()
:打开文件后进行写入操作
# 方法1:使用 with 自动保存(推荐)
with pd.ExcelWriter("examples/ex3.xlsx") as writer:
frame.to_excel(writer, sheet_name="Sheet1") # 自动保存,无需手动调用 save()
# 方法2:手动保存(不推荐,容易忘记 close())
writer = pd.ExcelWriter("examples/ex3.xlsx")
frame.to_excel(writer, sheet_name="Sheet1")
writer.save() # 手动保存
writer.close() # 必须手动关闭,否则文件可能被占用
4. SQL 数据库读写
1. 链接数据库(每个数据库的链接方式可能不同)大致可归为两类
使用SQLAlchemy连接(推荐)
PostgreSQL:postgresql://
MySQL:mysql://
或mysql+pymysql://
SQLite:sqlite:/// (本地文件)
或sqlite:///:memory: (内存数据库)
Oracle:oracle://
或oracle+cx_oracle://
SQL Server:mssql+pyodbc://
或mssql+pymssql://
from sqlalchemy import create_engine import pandas as pd # 创建数据库连接引擎 # 格式: dialect+driver://username:password@host:port/database engine = create_engine('postgresql://user:password@localhost:5432/mydb')
使用DBAPI2连接(如sqlite3, psycopg2等)
import sqlite3 import pandas as pd # 创建连接 conn = sqlite3.connect('example.db') # 想要进行的操作 # 关闭连接 conn.close()
2. 编写SQL语句,使用pd.read_sql()
函数在数据库中进行进行查询和写入
- 函数的参数:
con: 数据库连接对象
index_col: 用作行索引的列
coerce_float: 尝试将非字符串非数字对象转换为浮点数(默认为True)
params: 查询参数列表或字典
parse_dates: 要解析为日期的列
chunksize: 如果指定,返回迭代器
# 从数据库读取数据到DataFrame
df = pd.read_sql('SELECT * FROM mytable', con=engine)
# 将DataFrame写入数据库
df.to_sql('new_table', con=engine, if_exists='replace', index=False)
3. 他操作数据表的方法:使用数据表对象调用execute()、executemany()函数
# 创建连接
conn = sqlite3.connect('example.db')
cur = conn.cursor() # 使用原生DB-API游标
# 创建表
cur.execute("""
CREATE TABLE games (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
release_year INTEGER,
price REAL,
positive INTEGER,
negative INTEGER
)
""")
# 插入数据
games = [
("GTA V", 2015, 29.99, 350000, 50000),
("The Witcher 3", 2015, 39.99, 450000, 30000),
("Stardew Valley", 2016, 14.99, 250000, 10000),
("Cyberpunk 2077", 2020, 59.99, 300000, 150000),
("CS:GO", 2012, 0.00, 600000, 100000),
]
cur.executemany("INSERT INTO games (name, release_year, price, positive, negative) VALUES (?, ?, ?, ?, ?)", games)
# 删除表(可选)
cur.execute("DROP TABLE IF EXISTS games")
conn.commit() # 提交,对数据库的修改,真的写到磁盘中
# 先关闭游标再关闭连接,保证事务的完整
cur.close()
conn.close()
5. 其他格式文件读取
HTML 表格(read_html()
)
# 读取网页中的表格
# 默认条件下它会搜索,尝试解析<table>标签内的所有表格数据,结果是DataFrame对象的列表
tables = pd.read_html('http://example.com/tables.html')
df = tables[0] # 获取第一个表格
HDF5 文件(read_hdf
)
# 读取HDF5文件
df = pd.read_hdf('data.h5', key='dataset_name')
Parquet 文件(read_parquet
)
# 读取Parquet文件
df = pd.read_parquet('data.parquet')
Feather 文件(read_feather
)
# 读取Feather文件
df = pd.read_feather('data.feather')
6. 大数据集读取技巧
# 分块读取大文件
chunk_iter = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunk_iter:
process(chunk) # 处理每个数据块
# 指定数据类型减少内存占用
dtypes = {'col1': 'int8', 'col2': 'category', 'col3': 'float32'}
df = pd.read_csv('large_file.csv', dtype=dtypes)
# 使用低内存模式
df = pd.read_csv('large_file.csv', low_memory=True)
7. 与Web API交互
许多网站都有一些通过JSON或其他格式提供获取数据的公共API。推荐使用requests包向网站发起请求。
- 依赖包:pip install requests / conda install requests
import pandas as pd
import requests
# 从API获取JSON数据
url = 'https://api.example.com/data'
response = requests.get(url)
response.raise_for_status() # 使用requests.get之后,调用raise_for_status检查HTTP的错误
# 响应对象的json方法会返回一个Python对象,其中包含解析过的JSON数据字典或列表(取决于返回的JSON是什么)
data = response.json() # 将响应里的字符串,按json解析成了python数据列表/字典
# 转换为DataFrame
df = pd.read_json(data) # 直接解析JSON
# 或
df = pd.DataFrame(data) # 从字典创建DataFrame