Python笔记1(赋值、浅拷贝和深拷贝、字符串日期转换、argparse、sys、overwrite、eval、json.dumps/json.loads、os.system(cmd)、zfill)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python笔记1(赋值、浅拷贝和深拷贝、字符串日期转换、argparse、sys、overwrite、eval、json.dumps/json.loads、os.system(cmd)、zfill)

1、字符串转换为日期

dt_date = datetime.datetime.strptime(ymd, "%Y%m%d")

2、日期转换为字符串

date = dt_date.strftime("%Y-%m-%d")

3、昨天

(datetime.datetime.strptime(date, "%Y%m%d") - datetime.timedelta(1)).strftime("%Y%m%d")

4、argparse

命令行选项、参数和子命令解析器

5、sys模块

提供了一系列有关Python运行环境的变量和函数

  • sys.argv:实现从程序外部向程序传递参数,可以用sys.argv获取当前正在执行的命令行参数的参数列表(list)。
  • sys.path:返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

6、overwrite

dataframe写入的一种模式,dataframe写入的模式一共有4种

def mode(saveMode: String): DataFrameWriter = {
    this.mode = saveMode.toLowerCase match {
      case "overwrite" => SaveMode.Overwrite              // 覆盖已经存在的文件
      case "append" => SaveMode.Append                    // 向存在的文件追加
      case "ignore" => SaveMode.Ignore                    // 如果文件已存在,则忽略保存操作
      case "error" | "default" => SaveMode.ErrorIfExists  // 如果文件存在,则报错
      case _ => throw new IllegalArgumentException(s"Unknown save mode: $saveMode. " +
        "Accepted modes are 'overwrite', 'append', 'ignore', 'error'.")
    }
    this
  }

7、eval

用来执行一个字符串表达式,并返回表达式的值

eval(expression[, globals[, locals]])

参数

  • expression – 表达式。
  • globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

还可以进行字符串与list、tuple、dict的转化

8、json.dumps()和json.loads()

json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)

  1. json.dumps():Python 字典类型转换为 JSON 对象
  2. json.loads():将 JSON 对象转换为 Python 字典

9、os.system(cmd)

使用os.system(cmd)即可在python中使用linux命令

10、if __name__ == ‘__main__’:的作用

一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if __name__ == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if __name__ == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。

11、zfill

返回指定长度的字符串,原字符串右对齐,前面填充0

12、如果不够两位,前位补0

# 如果不够两位,前位补0
conf = "qzk"
date = "20220606"
h = 6
h1 = 16
s1 = f"{conf}/{date}/{h:0>2d}"
s2 = f"{conf}/{date}/{h1:0>2d}"
print(s1)
print(s2)
# 输出
qzk/20220606/06
qzk/20220606/16

13、Python 直接赋值、浅拷贝和深度拷贝解析

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

字典浅/深拷贝实例

>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

解析

1、b = a: 赋值引用,a 和 b 都指向同一个对象。
2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

14、endswith()

作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型

相关函数:判断字符串开头 startswith()

函数说明语法:

string.endswith(str, beg=[0,end=len(string)])
string[beg:end].endswith(str)

参数说明

  • string: 被检测的字符串
  • str: 指定的字符或者子字符串(可以使用元组,会逐一匹配)
  • beg: 设置字符串检测的起始位置(可选,从左数起)
  • end: 设置字符串检测的结束位置(可选,从左数起)

如果存在参数 beg 和 end,则在指定范围内检查,否则在整个字符串中检查

返回值:

如果检测到字符串,则返回True,否则返回False。

解析:如果字符串string是以str结束,则返回True,否则返回False

注:会认为空字符为真

15、with open() as file和open()参数详解

with open() as file: 是 Python 中用于打开文件的语法结构。

  • withas 是 Python 的关键字,用于创建一个上下文环境,确保在离开该环境时资源能够被正确关闭或释放。
  • open() 是一个内置函数,用于打开文件并返回一个文件对象。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

open() 函数的各个参数的详细解释:

  1. file:要打开的文件名(或文件路径)。可以是相对路径或绝对路径。
  2. mode(可选):打开文件的模式。它是一个字符串参数,默认值为'r'(只读模式)。常用的打开模式包括:
  • 'r':只读模式。文件从开头位置开始读取,默认模式。
  • 'w':写入模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件进行写入。
  • 'x':独占创建模式。只写模式,用于创建新文件。如果文件已存在,则抛出 FileExistsError 异常。
  • 'a':追加模式。文件从末尾位置开始写入,如果文件不存在,则创建新文件。
  • 'b':二进制模式。以二进制形式读取或写入文件,用于处理非文本文件。
  • 't':文本模式(默认)。以文本形式读取或写入文件,用于处理文本文件。
  1. buffering(可选):指定文件的缓冲策略。可以为整数值来指定缓冲区大小,或者使用 -1(默认值)来选择默认的缓冲机制。
  2. encoding(可选):指定文件的编码格式。例如,'utf-8''latin-1' 等。如果不指定该参数,在文本模式下将使用系统默认编码。
  3. errors(可选):指定编解码错误的处理方式。默认值为 None,表示使用默认的错误处理机制。
  4. newline(可选):指定用于文本模式下换行符的转换方式。可以是 None(默认值,保持系统默认),''(不进行转换),'\n'(将换行符转换为 \n),'\r'(将换行符转换为 \r)等。
  5. closefd(可选):定义当文件对象关闭时是否关闭与文件描述符相关的底层文件。默认值为 True,表示关闭文件。
  6. opener(可选):用于自定义打开文件的底层实现的函数。

读写

# 1. 打开⽂件   f:file文件的缩写
f = open('test.txt', 'w')
# 2.⽂件写⼊
f.write('hello world')
# 3. 关闭⽂件
f.close()
  • writelines():写入的必须是列表类型。
  • readlines():可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
  • readline():一次读取一行内容。

16、logging

日志的等级

日志级别 使用场景
DEBUG 用于调试阶段,输出详细的调试信息,通常不会在生产环境中使用
INFO 用于输出程序运行的一般信息,例如程序启动、停止等
WARNING 用于输出警告信息,例如程序运行时出现了一些不严重的问题,但需要引起注意
ERROR 用于输出错误信息,例如程序运行时出现了一些严重的问题,需要及时处理
CRITICAL 用于输出严重的错误信息,例如程序崩溃、系统崩溃等,需要立即处理

logging.basicConfig(*kwargs)

参数名称 描述
filename 指定日志输出目标文件的文件名,指定该参数后日志信息就不会输出到控制台上
filemode 指定日志文件的打开模式,默认为’a’.需要注意的是,该选项要在filename被指定时才有效
format 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序
datefmt 指定日志记录中日期和时间的格式,该选项要在format中包含时间字段%(asctime)s时才有效
level 指定日志器的日志级别,小于该级别将不会输出
stream 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常
style 指定format格式字符串的风格,可取值为’%‘、’{‘和’$‘,默认为’%’

format

字段/属性名称 使用格式 描述
asctime %(asctime)s 日志事件发生的事时间
levelname %(levelname)s 该日志记录的文字形式的日志级别(‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname的文件名部分,包含文件后缀
module %(module)s filename的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)

17、os、shutil、glob

os

shutil

glob

查找指定的文件

想查找的文件名已知道,但目录在哪里不知道

# coding:utf-8
import glob
path = glob.os.path.join(glob.os.getcwd(), '*')
# 获取当前路径下所有内容
# 判断每个内容的类型(文件夹还是文件)
# 递归
final_result = []
def search(path, target):
    result = glob.glob(path)
    for data in result:
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data, '*')
            search(_path, target)
        else:
            if target in data:
                final_result.append(data)
    return final_result
# /home/test1.py   if test1 in /test1/abc.py
if __name__ == '__main__':
    result = search(path, target='test1')
    print(result)

查找含有指定文件的内容

文件中包含某些关键字,但不知道文件名和所在路径

# coding:utf-8
import glob
path = glob.os.path.join(glob.os.getcwd(), '*')
# 获取当前路径下所有内容
# 判断每个内容的类型(文件夹还是文件)
# 递归
final_result = []
def search(path, target):
    result =  glob.glob(path)
    for data in result:
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data, '*')
            print('path is %s' % _path)
            search(_path, target)
        else:
            f = open(data, 'r')
            try:
                content = f.read()
                if target in content:
                    final_result.append(data)
            except:
                print('data read failed: %s' % data)
                continue
            finally:
                f.close()
    return final_result
if __name__ == '__main__':
    result = search(path, target='dewei')
    print(result)

批量修改目录中的文件名称

知道文件名需要修改的字符串

# coding:utf-8
import glob
import shutil
def update_name(path):
    result = glob.glob(path)
    for index, data in enumerate(result):
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data, '*')
            update_name(_path)
        else:
            path_list = glob.os.path.split(data)
            # [/home/xxxx, name.txt]
            name = path_list[-1]
            new_name = '%s_%s' % (index, name) # '0_name.txt'
            new_data = glob.os.path.join(path_list[0], new_name)
            shutil.move(data, new_data)
if __name__ == '__main__':
    path = glob.os.path.join(glob.os.getcwd(), '*')
    update_name(path)
相关文章
|
9天前
|
开发者 Python
Python中的f-string:更简洁的字符串格式化
Python中的f-string:更简洁的字符串格式化
185 93
|
9天前
|
Python
Python中的f-string:更简洁的字符串格式化
Python中的f-string:更简洁的字符串格式化
148 92
|
28天前
|
索引 Python
python 字符串的所有基础知识
python 字符串的所有基础知识
148 0
|
1月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
2月前
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
2月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
155 0
|
11天前
|
JSON 安全 API
Python处理JSON数据的最佳实践:从基础到进阶的实用指南
JSON作为数据交换通用格式,广泛应用于Web开发与API交互。本文详解Python处理JSON的10个关键实践,涵盖序列化、复杂结构处理、性能优化与安全编程,助开发者高效应对各类JSON数据挑战。
69 1
|
19天前
|
存储 小程序 索引
Python变量与基础数据类型:整型、浮点型和字符串操作全解析
在Python编程中,变量和数据类型是构建程序的基础。本文介绍了三种基本数据类型:整型(int)、浮点型(float)和字符串(str),以及它们在变量中的使用方式和常见操作。通过理解变量的动态特性、数据类型的转换与运算规则,初学者可以更高效地编写清晰、简洁的Python代码,为后续学习打下坚实基础。
104 0
|
机器学习/深度学习 存储 算法
Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别
Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
195 33