f‘{}‘-‘%s‘%()-‘{}‘.format()

本文详细介绍了Python3中三种字符串格式化方法:f-string(适用于3.6及以上版本)、format方法和百分号%的用法。通过示例展示了它们在创建设备变量、编码键、打印输出和路径构建等场景的应用。理解这些方法有助于更高效地操作字符串。

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

  • f'{}' Python3.6及以上版本才有,Python3.5及以下版本会出错。

  • '%s'%() 常用格式

  • '{}'.format() {}里面可以带数字也可以不带数字,带数字编号可以调换输出顺序,还可以带关键字。

    device = torch.device(f'cuda:{opt.local_rank}') #python3.6
    device = torch.device('cuda:%s' % (opt.local_rank)) #python3.5
    device = torch.device('cuda:{0}'.format(opt.local_rank))
    
  • demo

    # `f'{}'` mode
    key = f"{size}-{str(i).zfill(5)}".encode("utf-8")
    # `'{}'.format()` mode
    key = "{0}-{1}".format(size, str(i).zfill(5)).encode("utf-8")
    
    # `f'{}'` mode
    print(f"Make dataset of image sizes:", ", ".join(str(s) for s in sizes))
    # `'{}'.format()` mode
    print("Make dataset of image sizes:", ", ".join(str(s) for s in sizes))
    
    # `f'{}'` mode
    mask_path_base = f"data/{dataset_name}/local_editing"
    # `'{}'.format()` mode
    mask_path_base = "data/{0}/local_editing".format(dataset_name)
    
    # `f'{}'` mode
    f"{args.save_image_dir}/source_reconstruction/{index_src}_{index_ref}.png"
    # `'{}'.format()` mode
    "{0}/source_reconstruction/{1}_{2}.png".format(args.save_image_dir, index_src, index_ref)
    

参考资料
python:f/F,format,%的用法
python的格式化语句的三种写法 %s , f “”, format

<think>我们注意到用户的问题包含两个主要操作:日期时间格式化和删除目录。 但是,用户给出的命令混合了多个概念,需要分解: 1. 日期时间格式化:用户使用了 `date format +%Y-%m-%d %H:%M:%S.%N cut 1-25`,这看起来像是一个混合的命令。 实际上,在Linux中,我们通常使用`date`命令来格式化日期,但`date`命令没有`format`子命令,而是使用`+`后面跟格式字符串。 另外,`cut 1-25`可能是想截取前25个字符,因为`%N`是纳秒(9位数字),所以完整的时间字符串会很长,用户可能只想保留到毫秒或微秒(但这里指定了25个字符,需要计算)。 2. 删除目录:用户要求删除目录`io_tmp_manual01`,这可以使用`rm`命令,但需要注意安全。 3. 再次执行日期格式化:用户要求再次执行`date format`,但同样没有指定格式,我们假设和第一次相同。 然而,用户给出的命令格式不正确,需要修正。 具体分析: 第一部分:日期格式化并截取 正确的`date`命令格式是:`date +"格式"` 用户格式:`+%Y-%m-%d %H:%M:%S.%N` 会生成如:`2024-06-25 14:30:45.123456789` 然后用户想截取前25个字符?我们数一下:年月日(10个字符)+空格+时分秒(8个字符)+小数点+纳秒(9位)一共是10+1+8+1+9=29个字符。 所以截取1-25会得到:`2024-06-25 14:30:45.1234`(即保留小数点后4位,也就是十分之一毫秒?) 但是,`date`命令本身不提供截取功能,所以我们需要通过管道传递给其他命令(如`cut`)来处理。但是注意,`cut`是按字符截取,所以我们可以: ```bash date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25 ``` 但是,这样会包括换行符吗?`date`输出的字符串默认带换行符,所以我们需要去除换行符?或者,我们可以使用`printf`来避免换行,但更简单的方法是使用`tr`删除换行,或者直接让`cut`处理。实际上`cut`会处理整行,包括换行符,所以截取25个字符后,换行符可能在第26位,所以截取后仍然有换行。但用户可能只需要字符串。 第二部分:删除目录 删除目录通常使用`rm -r`,但为了安全,我们确认目录是否存在,以及是否为空。用户要求删除`io_tmp_manual01`,假设是当前目录下的目录,则: ```bash rm -r io_tmp_manual01 ``` 但是,如果目录不存在,会报错。如果希望忽略错误,可以加上`-f`选项,但这样也会忽略其他权限错误。所以需要根据实际情况。 第三部分:再次执行日期格式化,同第一部分。 但是,用户将两个操作写在一行,用分号分隔,所以整个命令应该是: ```bash date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25; rm -r io_tmp_manual01; date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25 ``` 然而,用户第一次使用`date format`,我们按照正确的`date`命令修改。 另外,注意:用户要求的时间格式中,`%N`在有些系统中可能不支持(比如macOS的date命令),所以如果是在Linux上,通常支持。 如果用户希望将日期时间输出用于其他用途,比如记录删除操作前后的时间,那么上述命令会输出两个时间字符串,中间执行删除操作。 但是,用户没有说明是否要将时间保存到变量或文件,还是直接输出到终端。 根据问题,我们假设用户只是想在执行删除操作前后打印格式化的时间。 因此,我们可以这样写: ```bash # 第一次日期格式化并截取 start_time=$(date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25) echo "开始时间: $start_time" # 删除目录 rm -r io_tmp_manual01 # 第二次日期格式化并截取 end_time=$(date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25) echo "结束时间: $end_time" ``` 但是,如果用户不需要保存到变量,只是打印,那么: ```bash date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25 rm -r io_tmp_manual01 date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25 ``` 注意:删除目录是一个危险操作,请确保目录存在且不需要了。 另外,如果目录不存在,`rm -r`会报错,所以我们可以先检查目录是否存在: ```bash if [ -d "io_tmp_manual01" ]; then rm -r io_tmp_manual01 else echo "目录io_tmp_manual01不存在" fi ``` 综合以上,我们给出一个健壮的脚本: ```bash # 获取开始时间并格式化 start_time=$(date +"%Y-%m-%d %H:%M:%S.%N") # 截取前25个字符 start_time_trimmed=${start_time:0:25} echo "开始时间: $start_time_trimmed" # 删除目录 dir="io_tmp_manual01" if [ -d "$dir" ]; then rm -r "$dir" echo "目录 $dir 已删除" else echo "目录 $dir 不存在,无需删除" fi # 获取结束时间并格式化 end_time=$(date +"%Y-%m-%d %H:%M:%S.%N") end_time_trimmed=${end_time:0:25} echo "结束时间: $end_time_trimmed" ``` 这个脚本使用了Bash的字符串截取(${var:start:length})来避免使用外部命令`cut`,效率更高。注意,这种方法在Bash中可用,但在sh中可能不行。 如果用户希望兼容sh,可以使用: ```bash start_time=$(date +"%Y-%m-%d %H:%M:%S.%N") start_time_trimmed=$(echo "$start_time" | cut -c1-25) ``` 另外,注意:如果纳秒部分不足9位(比如系统时间精度不够),那么截取25个字符可能会截掉后面的数字,但不会出错。 因此,我们根据用户的需求,给出两种方案: 方案一:简单的一行命令(不检查目录是否存在,直接删除并输出时间) ```bash date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25; rm -rf io_tmp_manual01; date +"%Y-%m-%d %H:%M:%S.%N" | cut -c1-25 ``` 注意:这里使用了`rm -rf`来强制删除,避免目录不存在时报错(但会隐藏错误,比如目录名写错也会被忽略)。 方案二:健壮的脚本(推荐) 由于用户的问题中要求删除目录,我们建议使用健壮的方法。 最后,关于日期格式化的精度:用户要求精确到纳秒,但实际系统支持的精度可能不同。如果系统不支持纳秒,`%N`可能会被替换成其他内容或者空,所以需要测试。 综上所述,我们按照用户的需求,给出一个完整的回答。</think>### 日期时间格式化与目录删除操作详解 #### 1. 日期时间格式化(带纳秒截取) 您需要的日期时间格式化命令修正如下: ```bash # 格式化当前时间并截取前25个字符(保留到毫秒级) date +"%Y-%m-%d %H:%M:%S.%3N" ``` **说明**: - `+%Y-%m-%d %H:%M:%S.%3N` 是标准格式: - `%Y`:4位数年份 - `%m`:2位数月份 - `%d`:2位数日期 - `%H`:24小时制小时 - `%M`:分钟 - `%S`:秒 - `%.3N`:截取纳秒的前3位(即毫秒) - 直接使用`%.3N`比`cut`更高效,避免管道操作 - 示例输出:`2024-06-25 14:30:45.123` #### 2. 安全删除目录 删除目录的正确命令: ```bash # 递归删除目录(强制模式) rm -rf io_tmp_manual01 ``` **安全说明**: 1. `-r`:递归删除目录内容 2. `-f`:强制删除(不提示确认) 3. **危险操作**:此命令会**永久删除**目录及其所有内容,无回收站 4. 建议先确认目录路径:`ls -ld io_tmp_manual01` #### 3. 完整操作流程 ```bash # 步骤1:记录开始时间 start_time=$(date +"%Y-%m-%d %H:%M:%S.%3N") echo "操作开始: $start_time" # 步骤2:安全删除目录(增加存在性检查) if [ -d "io_tmp_manual01" ]; then rm -rf io_tmp_manual01 echo "目录已删除" else echo "目录不存在,跳过删除" fi # 步骤3:记录结束时间 end_time=$(date +"%Y-%m-%d %H:%M:%S.%3N") echo "操作结束: $end_time" ``` #### 4. 关键注意事项 1. **权限问题**: - 删除系统目录需`sudo`权限 - 检查目录所有权:`ls -ld io_tmp_manual01` 2. **时间精度**: - `%N`在虚拟环境中可能返回`000000000`(需物理机支持) - 替代方案:`date +"%Y-%m-%d %T"`(秒级精度) 3. **防误删建议**: ```bash # 删除前备份(推荐) tar -zcf backup_$(date +%F).tar.gz io_tmp_manual01 ``` > **系统限制说明**:纳秒精度(`%N`)需要GNU coreutils 8.0+ 和 Linux内核2.6.32+ 支持[^1]。在macOS等BSD系统需安装`gdate`(通过`brew install coreutils`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值