• Python零基础入门-7 输入与输出


    7. 输入与输出

    7.1 更复杂的输出格式

    用print()函数可以输出字符串到屏幕。对于输出的字符串,我们很多方法控制字符串的格式,如果你的python版本>=3.6,那么强烈推荐f字符串(f-string)。

    f-字符串(f-string)

    基础使用:

    f'something{var}'

    在普通字符串开头加上f,然后字符串内部 可以用{var}标记,{var}会被替换成变量的值。

    year = 2016
    event = 'Referendum'
    f'Results of the {year} {event}'
    #'Results of the 2016 Referendum'
    
    • 1
    • 2
    • 3
    • 4

    在{}内的变量后添加格式说明符。

    f'{变量:格式说明符号}'

    格式说明符内容非常多,下面只举几个常见的例子,更多细节见本文附录。

    :.长度f控制浮点数小数点后面位数:

    n = 1.23456
    f'{n:.2f}''  # 小数点后2位
    #1.23
    
    • 1
    • 2
    • 3

    ':长度' 为该字段设置最小字符宽度,常用于列对齐:

    table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
    for name, phone in table.items():
        print(f'{name:10} ==> {phone:10}')
    
    • 1
    • 2
    • 3

    详细的格式控制符在文档-Python标准库-文本处理服务-string中:string — 常见的字符串操作 — Python 3.10.4 文档

    文章最后的附录摘取了部分说明。

    repr与str

    使用用 repr() 或 str() 函数可以值转化为字符串。

    str() 函数返回供人阅读的值,repr() 则生成适于解释器读取的值。

    如果没有对于没有支持供人阅读展示结果的对象, str() 返回与 repr() 相同的值。

    一般情况下,数字、列表或字典等结构的值,使用这两个函数输出的表现形式是一样的。

    字符串有两种不同的表现形式。

    #先剧透一下,这两种方法实际上调用的是对象的__repr____str__方法(后面类里再说)。

    实现对齐

    str.rjust(width) 方法在左侧填充空格,保证指定宽度,实现对齐。

    类似的还有str.ljust(width) 和str.center(width)

    for x in range(1, 11):
        print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
        # Note use of 'end' on previous line
        print(repr(x*x*x).rjust(4))
    
    • 1
    • 2
    • 3
    • 4

    这些方法不写入任何内容,只返回一个新字符串,如果输入的字符串太长,它们不会截断字符串,而是原样返回。

    其它格式化字符串方法

    • % 运算符(求余符)

      % 运算符也可用于字符串格式化。给定 'string' % values,则 string 中的 % 实例会以零个或多个 values 元素替换。此操作被称为字符串插值。例如:

    • str.format() f-字符串已经实现了它的功能,不再多说。

      print('We are the {} who say "{}!"'.format('knights', 'Ni'))
      #输出: We are the knights who say "Ni!"
      
      • 1
      • 2

    7.2 读写文件

    我们首先要获取文件对象,然后调用文件对象的读写方法,最后关闭文件对象。

    获取文件对象

    open()方法返回一个文件对象(用于读写)。通常使用

    open(filename, mode, encoding=None)来调用该方法,如:

    f = open('workfile', 'w', encoding="utf-8")
    
    • 1

    第一个参数是文件名。第二个参数是打开方式,''w‘表示写入模式,‘r’’表示读取模式,'a’表示追加模式,'r+'表示读写模式,‘b’表示二进制格式。mode默认值为’r’。

    我们通常读写的是文本文件,文本文件有一些不同的编码格式(encoding)。如果没有指定,默认值是所在操作系统默认编码。由于UTF-8是目前标准的编码格式,所以一般设置

    encoding=“utf-8”。

    在处理文件时,一般使用with关键字,可以自动关闭文件。

    否则需要使用f.close()来手动关闭,释放文件资源。

    with open('workfile', encoding="utf-8") as f:
        read_data = f.read()
    
    # with 块结束后文件会被自动关闭
    f.closed
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件对象的方法

    假设已经有了文件对象f。

    • f.read(size) 取文件内容,返回字符串。size可选表示最多读取字符数,不写时默认读取整个文件。

    • f.readline() 从文件单行数据,字符串末尾保留换行符。f.readline() 返回空字符串,就表示已经到达了文件末尾,空行使用 '\n' 表示,该字符串只包含一个换行符。

    • f.readlines() 如需以列表形式取文件中的所有行,可以用 list(f) 或 f.readlines()

    从文件中读取多行时,可以用循环遍历整个文件对象。这种操作能高效利用内存,快速,且代码简单:

    for line in f:
        print(line, end='')
    
    • 1
    • 2
    • f.write(string) 把 string 的内容入文件,并返回写入的字符数。

    • f.tell() 返回整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的意义不明的数字。

    • f.seek(offset, whence) 可以改变文件对象的位置。通过向参考点添加 offset 计算位置;参考点由 whence 参数指定。 whence 值为 0 时,表示从文件开头计算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。省略 whence 时,其默认值为 0,即使用文件开头作为参考点。

    使用json保存结构化数据

    json全称是JavaScript Object Notation(JavaScript 对象表示法)。类似字典格式:

    {
        "sites": [
        { "name":"菜鸟教程" , "url":"www.runoob.com" }, 
        { "name":"google" , "url":"www.google.com" }, 
        { "name":"微博" , "url":"www.weibo.com" }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    json 标准模块采用 Python 数据层次结构,并将之转换为字符串表示形式;这个过程称为 serializing (序列化)。从字符串表示中重建数据称为 deserializing (解序化)。

    import json
    x = [1, 'simple', 'list']
    json.dumps(x)
    
    • 1
    • 2
    • 3

    如果f是文件对象,可以用下面方法在文件中读写json格式数据。(当然,f是用with open…打开的)

    json.dump(x, f)   # 序列化为json格式
    
    x = json.load(f)  # 转为python字典格式
    
    • 1
    • 2
    • 3

    附录:格式说明符(format_spec):

    format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
    fill            ::=  <any character>
    align           ::=  "<" | ">" | "=" | "^"
    sign            ::=  "+" | "-" | " "
    width           ::=  digit+
    grouping_option ::=  "_" | ","
    precision       ::=  digit+
    type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    说明:

    fill 是填充字符

    align是对齐方式

    sign是数字符号(±)

    '#' 选项可让“替代形式”被用于执行转换。 替代形式会针对不同的类型分别定义。 此选项仅适用于整数、浮点数和复数类型。 对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值分别添加相应的 '0b''0o''0x' 或 '0X' 前缀。 对于浮点数和复数类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数部分。 通常只有在带有小数部分的情况下,此类转换的结果中才会出现小数点符号。 此外,对于 'g' 和 'G' 转换,末尾的零不会从结果中被移除。

    width 是一个定义最小总字段宽度的十进制整数,包括任何前缀、分隔符和其他格式化字符。 如果未指定,则字段宽度将由内容确定。

    当未显式给出对齐方式时,在 width 字段前加一个零 ('0') 字段将为数字类型启用感知正负号的零填充。 这相当于设置 fill 字符为 '0' 且 alignment 类型为 '='

    grouping_option中',' 选项表示使用逗号作为千位分隔符。 对于感应区域设置的分隔符,请改用 'n' 整数表示类型。

    '_' 选项表示对浮点表示类型和整数表示类型 'd' 使用下划线作为千位分隔符。 对于整数表示类型 'b''o''x' 和 'X',将为每 4 个数位插入一个下划线。 对于其他表示类型指定此选项则将导致错误。

    .precision,精度‎‎是一个十进制整数,对f'``F指示应在小数点后显示多少位数字,对于g``G类型,指示小数点之前和之后显示多少位数字。

    对于字符串表示类型,该字段指示最大字段大小 - 换句话说,最多字符数。整数表示类型不允许使用‎‎精度‎‎。‎

    type 确定了数据应如何呈现(例如进制)。

  • 相关阅读:
    Django
    CSDN每日一题学习训练——Python版(输入起始和结束的正整数,求其两个正整数之间的偶数和、两数相加)
    设计模式之策略模式
    CTFshow 命令执行 web32 33 34 35 36
    java实现数据库:mbdb-基于文件存储的关系型数据库
    vue3 reactive使用(四)
    Java创建对象的最佳方式:单例模式(Singleton)
    WPF的由来
    Android Studio(2022.3.1)设置阿里云源-新旧版本
    Java中的单元测试:JUnit5实践指南
  • 原文地址:https://blog.csdn.net/qq_41068877/article/details/125439691