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

简介: 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)
相关文章
|
20天前
|
存储 设计模式 算法
|
1月前
|
Python
python增量赋值运算的应用
Python中的增量赋值运算符用于便捷地执行算术操作,如`+=`, `-=`等,它们分别代表加法、减法、乘法、除法、取模、整除和幂运算。
14 1
|
1天前
|
存储 Python
【Python操作基础】系列——赋值语句
【Python操作基础】系列——赋值语句
|
2天前
|
数据采集 数据可视化 数据挖掘
【新手解答】Python中Pandas的初学者笔记
【新手解答】Python中Pandas的初学者笔记
4 0
|
5天前
|
Python
Python中赋值使地址一样的技术探究
Python中赋值使地址一样的技术探究
19 0
|
8天前
|
Java 开发者 索引
Python基础语法:类笔记
本篇博文是把自己在学习python类的过程中自己理解和笔记,一点一点总结的写出出来,做一个总结,加深对面向对象编程的理解。
|
10天前
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
38 0
|
13天前
|
存储 JSON DataWorks
DataWorks产品使用合集之DataWorks将 MongoDB 中的数组类型写入到 DataWorks 的单个字段时,表示为字符串格式而非 JSON 格式如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
25 3
|
13天前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之大数据计算MaxCompute 要提取JSON字符串中的所有key-value对,我该怎么操作
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
19天前
|
Python
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
19 0