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)
相关文章
|
24天前
|
Python
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
119 64
|
15天前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
38 5
|
19天前
|
Python
使用Python计算字符串的SHA-256散列值
使用Python计算字符串的SHA-256散列值
24 7
|
26天前
|
Python
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
32 6
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
35 0
|
2月前
|
自然语言处理 Java 数据处理
【速收藏】python字符串操作,你会几个?
【速收藏】python字符串操作,你会几个?
61 7
|
2月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
53 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
2月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
54 0
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
下一篇
DataWorks