python logging 不输出控制台_Python中使用logging模块代替print(logging简明指南)

本文介绍如何使用Python的logging模块替代print语句进行日志记录,包括基本配置、使用logger及动态控制输出等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

替换print?print怎么了?

print 可能是所有学习Python语言的人第一个接触的东西。它最主要的功能就是往控制台 打印一段信息,像这样:

复制代码 代码如下:

print 'Hello, logging!'

print也是绝大多数人用来调试自己的程序用的最多的东西,就像写js使用 console.log 一样那么自然。很多刚刚开始学习Python的新手甚至有一定经验的老手,都在使用print 来调试他们的代码。

比如这是一个我写的输出 斐波那契数列 的小程序,让我们来看看它的代码:

复制代码 代码如下:

# -*- coding: utf-8 -*-

"""

A simple fibonacci program

"""

import argparse

parser = argparse.ArgumentParser(description='I print fibonacci sequence')

parser.add_argument('-s', '--start', type=int, dest='start',

help='Start of the sequence', required=True)

parser.add_argument('-e', '--end', type=int, dest='end',

help='End of the sequence', required=True)

def infinite_fib():

a, b = 0, 1

yield a

yield b

while True:

#print 'Before caculation: a, b = %s, %s' % (a, b)

a, b = b, a + b

#print 'After caculation: a, b = %s, %s' % (a, b)

yield b

def fib(start, end):

for cur in infinite_fib():

#print 'cur: %s, start: %s, end: %s' % (cur, start, end)

if cur > end:

return

if cur >= start:

#print 'Returning result %s' % cur

yield cur

def main():

args = parser.parse_args()

for n in fib(args.start, args.end):

print n,

if __name__ == '__main__':

main()

让我们来看看它工作的怎么样:

复制代码 代码如下:

$ python fib.py -s 1 -e 100

1 1 2 3 5 8 13 21 34 55 89

$ python fib.py -s 100 -e 1000

144 233 377 610 987

没有任何问题,程序正确的完成了它的功能。但等等, 程序里面的那一堆被注释掉的print语句是怎么回事?

原来,这是我编写这个小程序的过程中,用来 调试(DEBUG) 的输出信息,在我完成了这 个程序以后,我自然就把这些print给注释掉了。让我们来看看如果把这个print语句打开后结果会怎么样?

复制代码 代码如下:

$ python fib.py -s 1 -e 100

cur: 0, start: 1, end: 100

cur: 1, start: 1, end: 100

Returning result 1

1 Before caculation: a, b = 0, 1

After caculation: a, b = 1, 1

cur: 1, start: 1, end: 100

... ...

... ...

(不计其数的输出信息)

如你所见,所有的计算过程都被打印出来了。

写的时候加上print,提交代码的时候还得记得把print语句删掉/注释掉,为什么我们要忍受这样的麻烦事呢? 让我们来介绍我们的主角 logging ,它几乎就是为这种使用情景而生的。

更好的做法,使用logging模块

logging模块是Python内置的日志模块,使用它可以非常轻松的处理和管理日志输出。 logging模块最简单的用法,是直接使用basicConfig方法来对logging进行配置:

复制代码 代码如下:

import logging

# 设置默认的level为DEBUG

# 设置log的格式

logging.basicConfig(

level=logging.DEBUG,

format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"

)

# 记录log

logging.debug(...)

logging.info(...)

logging.warn(...)

logging.error(...)

logging.critical(...)

这样配置完logging以后,然后使用``logging.debug``来替换所有的print语句就可以了。 我们会看到这样的输出:

复制代码 代码如下:

[2014-03-18 15:17:45,216] root:cur: 0, start: 1, end: 100

[2014-03-18 15:17:45,216] root:DEBUG: cur: 1, start: 1, end: 100

[2014-03-18 15:17:45,216] root:DEBUG: Returning result 1

[2014-03-18 15:17:45,216] root:DEBUG: Before caculation: a, b = 0, 1

... ...

使用真正的logger

上面说的basicConfig方法可以满足你在绝大多数场景下的使用需求,但是basicConfig有一个 很大的缺点。

调用basicConfig其实是给root logger添加了一个handler,这样当你的程序和别的使用了 logging的第三方模块一起工作时,会影响第三方模块的logger行为。这是由logger的继承特性决定的。

所以我们需要使用真正的logger:

复制代码 代码如下:

import logging

# 使用一个名字为fib的logger

logger = logging.getLogger('fib')

# 设置logger的level为DEBUG

logger.setLevel(logging.DEBUG)

# 创建一个输出日志到控制台的StreamHandler

hdr = logging.StreamHandler()

formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')

hdr.setFormatter(formatter)

# 给logger添加上handler

logger.addHandler(hdr)

这样再使用logger来进行日志输出就行了。不过这样的坏处就是代码量比basicConfig要大不少。 所以我建议如果是非常简单的小脚本的话,直接使用basicConfig就可以,如果是稍微大一些 项目,建议认真配置好logger。

动态控制脚本的所有输出

使用了logging模块以后,通过修改logger的log level,我们就可以方便的控制程序的输出了。 比如我们可以为我们的斐波那契数列添加一个 -v 参数,来控制打印所有的调试信息。

复制代码 代码如下:

# 添加接收一个verbose参数

parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',

help='Enable debug info')

# 判断verbose

if args.verbose:

logger.setLevel(logging.DEBUG)

else:

logger.setLevel(logging.ERROR)

这样,默认情况下,我们的小程序是不会打印调试信息的,只有当传入`-v/--verbose`的时候, 我们才会打印出额外的debug信息,就像这样:

复制代码 代码如下:

$ python fib.py -s 1 -e 100

1 1 2 3 5 8 13 21 34 55 89

$ python fib.py -s 1 -e 100 -v

[2014-03-18 15:17:45,216] fib:DEBUG: cur: 0, start: 1, end: 100

[2014-03-18 15:17:45,216] fib:DEBUG: cur: 1, start: 1, end: 100

[2014-03-18 15:17:45,216] fib:DEBUG: Returning result 1

[2014-03-18 15:17:45,216] fib:DEBUG: Before caculation: a, b = 0, 1

... ...

如你所见,使用了logging以后,什么时候需要打印DEBUG信息,什么时候需要关闭, 一切变的无比简单。

所以,赶紧用logging替换掉你的脚本里的print吧!

延伸阅读

以上这些只是介绍了logging模块最简单的一些功能,作为print的替代品来使用,logging 模块还有很多非常强大好用的功能,比如从文件读取配置、各种各样的Handlers等等。 建议阅读一下logging的官方文档:

1.logging Logging facility for Python

2.Logging HOWTO

最后附上使用logging模块的斐波那契数列程序完整代码:

复制代码 代码如下:

# -*- coding: utf-8 -*-

"""

A simple fibonacci program

"""

import argparse

parser = argparse.ArgumentParser(description='I print fibonacci sequence')

parser.add_argument('-s', '--start', type=int, dest='start',

help='Start of the sequence', required=True)

parser.add_argument('-e', '--end', type=int, dest='end',

help='End of the sequence', required=True)

parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',

help='Enable debug info')

import logging

logger = logging.getLogger('fib')

logger.setLevel(logging.DEBUG)

hdr = logging.StreamHandler()

formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')

hdr.setFormatter(formatter)

logger.addHandler(hdr)

def infinite_fib():

a, b = 0, 1

yield a

yield b

while True:

logger.debug('Before caculation: a, b = %s, %s' % (a, b))

a, b = b, a + b

logger.debug('After caculation: a, b = %s, %s' % (a, b))

yield b

def fib(start, end):

for cur in infinite_fib():

logger.debug('cur: %s, start: %s, end: %s' % (cur, start, end))

if cur > end:

return

if cur >= start:

logger.debug('Returning result %s' % cur)

yield cur

def main():

args = parser.parse_args()

if args.verbose:

logger.setLevel(logging.DEBUG)

else:

logger.setLevel(logging.ERROR)

for n in fib(args.start, args.end):

print n,

if __name__ == '__main__':

main()

本文标题: Python中使用logging模块代替print(logging简明指南)

本文地址: http://www.cppcns.com/jiaoben/python/110458.html

<think>嗯,用户现在想了解如何在PyCharm中进行数据清洗,从安装pandas开始,需要一个完整的教程。首先,我得确认用户的需求是什么。他们可能已经知道数据清洗的基本概念,但需要具体的操作步骤,特别是如何在PyCharm这个IDE里完成整个流程。用户可能刚接触Python或者PyCharm,所以需要详细的指导,包括环境设置、包安装、代码编写以及常见问题的解决。 首先,我需要考虑用户的背景。他们可能已经使用过Excel进行数据清洗,现在想转向Python和Pandas,因为处理更大的数据集时效率更高。但PyCharm作为开发环境,对于新手来说可能有些复杂,所以需要一步步引导。 接下来,安装pandas包的部分。用户可能熟悉PyCharm的包管理工具,或者虚拟环境的配置。需要详细说明如何通过图形界面或终端来安装pandas。另外,要提到可能需要安装其他常用库,比如NumPy或openpyxl,特别是处理Excel文件的时候。 然后是创建项目、文件的结构。用户可能需要了解如何在PyCharm中组织项目,新建Python文件,以及如何导入必要的库。这部分需要简明扼要,避免信息过载。 数据清洗的具体步骤,比如加载数据、处理缺失值、去重、类型转换、数据筛选、文本处理等,这些都是常见任务。每个步骤需要给出示例代码,并解释每行代码的作用,这样用户能理解为什么要这么做。 可能用户会遇到的问题,比如包安装失败,文件路径错误,或者数据类型匹配,这些都需要在教程中提前预警,并提供解决方法。例如,建议使用绝对路径或检查文件是否存在,处理日期格式时的常见错误等。 另外,用户可能希望将清洗后的数据保存到同格式的文件中,比如Excel或CSV,这部分需要给出示例代码,说明如何导出数据,并提醒可能的依赖库安装,比如openpyxl。 最后,常见问题解答部分需要覆盖用户可能遇到的典型问题,比如环境配置、编码问题、内存足等,给出实用的解决方案,这样用户遇到问题时可以快速参考。 整个教程需要结构清晰,步骤明确,代码示例正确,并且语言通俗易懂,避免使用过多专业术语,确保即使是新手也能跟随操作。同时,需要强调PyCharm特有的功能,比如如何利用其集成的终端和调试工具,提升数据清洗的效率。</think>以下是使用 **PyCharm** 进行数据清洗的完整教程,从安装 `pandas` 到完成基础清洗操作: --- ### 第一步:安装 Python 和 PyCharm 1. 若未安装 Python,从官网 [python.org](https://www.python.org/) 下载并安装(勾选 `Add Python to PATH`)。 2. 下载 PyCharm 社区版(免费)[JetBrains官网](https://www.jetbrains.com/pycharm/),安装后启动。 --- ### 第二步:在 PyCharm 中创建项目 1. 打开 PyCharm → `New Project` → 输入项目名称(如 `DataCleaning`)。 2. 选择 Python 解释器(默认会自动检测已安装的 Python)。 3. 点击 `Create`,等待项目初始化完成。 --- ### 第三步:安装 pandas 包 **方法1(推荐):通过 PyCharm 界面安装** 1. 点击 PyCharm 底部菜单栏的 `Terminal`(或顶部菜单 `View → Tool Windows → Terminal`)。 2. 输入以下命令安装 `pandas`: ```bash pip install pandas ``` (如需处理 Excel 文件,可一并安装 `openpyxl`:`pip install openpyxl`) **方法2:通过 PyCharm 包管理器** 1. 顶部菜单 → `File → Settings → Project → Python Interpreter`。 2. 点击 `+` → 搜索 `pandas` → 点击 `Install Package`。 --- ### 第四步:编写数据清洗代码 #### 1. 新建 Python 文件 - 右键项目目录 → `New → Python File` → 输入文件名(如 `data_cleaning.py`)。 #### 2. 基础代码框架 ```python # 导入库 import pandas as pd # 1. 加载数据(假设数据为 CSV 或 Excel 文件) file_path = "your_data.csv" # 替换为实际路径 df = pd.read_csv(file_path) # 如果是 Excel,用 pd.read_excel(file_path, engine='openpyxl') # 2. 查看数据基本信息 print("数据前5行:") print(df.head()) print("\n数据统计信息:") print(df.describe()) print("\n数据缺失情况:") print(df.isnull().sum()) # 3. 处理缺失值 # 方法1:删除缺失行 df_dropna = df.dropna() # 删除所有含缺失值的行 # 方法2:填充缺失值(如用均值填充数值列) df_fillna = df.fillna({ '数值列名': df['数值列名'].mean(), '文本列名': 'Unknown' # 文本列填充特定值 }) # 4. 删除重复值 df_unique = df.drop_duplicates() # 5. 处理数据类型(如日期转换) df['日期列名'] = pd.to_datetime(df['日期列名'], errors='coerce') # 错误日期转为 NaT # 6. 数据筛选(如保留特定条件的数据) df_filtered = df[df['数值列名'] > 100] # 筛选数值大于100的行 # 7. 文本清洗(如去除空格、统一格式) df['文本列名'] = df['文本列名'].str.strip() # 去除首尾空格 df['文本列名'] = df['文本列名'].str.lower() # 转为小写 # 8. 保存清洗后的数据 df.to_csv("cleaned_data.csv", index=False) # 保存为 CSV,Excel 用 to_excel() ``` --- ### 第五步:运行代码 1. 右键代码编辑区 → `Run 'data_cleaning'`(或点击右上角的绿色箭头)。 2. 在下方控制台查看输出结果,检查是否有报错。 --- ### 常见问题解决 1. **文件路径错误**: - 将数据文件放在项目目录下,或使用绝对路径(如 `C:/Users/name/data.csv`)。 2. **编码问题**: - 加载文件时指定编码,如 `pd.read_csv(file_path, encoding='utf-8')`。 3. **日期格式错误**: - 使用 `format` 参数明确日期格式,例如: ```python df['日期列'] = pd.to_datetime(df['日期列'], format='%Y-%m-%d') ``` 4. **内存足**: - 分块读取大数据:`pd.read_csv(file_path, chunksize=1000)`。 --- ### 扩展功能 - **自动化脚本**:将清洗步骤封装为函数,方便复用。 - **可视化检查**:结合 `matplotlib` 或 `seaborn` 绘制图表,识别异常值。 - **日志记录**:添加 `print` 或日志库(如 `logging`)跟踪清洗过程。 --- 通过以上步骤,你可以在 PyCharm 中完成从安装到数据清洗的全流程。如果有具体数据或需求,可以进一步优化代码逻辑!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值