Contents

Python教程-输入输出

本系列为作者在官网学习python时做的笔记,详见python官网

python标准库官方文档,查阅标准库相关的内容

python语言参考,查看python语法,该文档是简洁的,但试图做到准确和完整。非必要的内建对象类型和内建函数、模块的语义描述在 Python 标准库 中。

标准库和语言参考涵盖了python的所有内容,他们是互补的,如果在语言参考中没有找到需要的内容那么就一定在便准库文档中。

更漂亮的输出格式

使用 repr() 或 str() 函数将任何值转化为字符串快速显示某些变量以进行调试。

str() 函数是用于返回人类可读的值的表示,repr() 是用于生成解释器可读的表示(如果没有等效的语法,则会强制执行 SyntaxError)对于没有人类可读性的表示的对象, str() 将返回和 repr() 一样的值。

格式化字符串文字

格式化字符串字面值 (常简称为 f-字符串)能让你在字符串前加上 f 和 F 并将表达式写成 {expression} 来在字符串中包含 Python 表达式的值。

可选的格式说明符可以跟在表达式后面。这样可以更好地控制值的格式化方式。以下示例将pi舍入到小数点后三位:

1
2
3
>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.

在 ‘:’ 后传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用。:

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

其他的修饰符可用于在格式化之前转化值。 ‘!a’ 应用 ascii() ,’!s’ 应用 str(),还有 ‘!r’ 应用 repr():

1
2
3
4
5
>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.

Python编程基础:f-字符串格式

f字符串是format方法的格式一致。

可以与r原始字符串一起使用,还可以使用条件表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
parent_dir = rf'D:\完美Exce1 Python'
subfolder ='MyFiles'
file_path = 'file01.x1sx
print(rf'{fparent_dir}\{lsubfolder} \{file_path}')

pass_mark = 50
mark_1 =60
mark_2 =49
print(f"student 1 {'pass'if mark_1 > pass_mark else 'fail'}")
print(f"student 2 {'pass'if mark_2 > pass_mark else 'fail'}")

字符串的 format() 方法

1
2
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"

花括号中的数字可用来表示传递给 str.format() 方法的对象的位置。

1
2
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam

如果在 str.format() 方法中使用关键字参数,则使用参数的名称引用它们的值

1
2
3
>>> print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.

位置和关键字参数可以任意组合:

1
2
3
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
                                                       other='Georg'))
The story of Bill, Manfred, and Georg.

可以给format传递字典

1
2
3
4
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...       'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

内置函数 vars() 返回包含所有局部变量的字典。

手动格式化字符串

print函数的sep和end选项,字符串的ljust,rjust,center以及zfill方法

旧的字符串格式化方法

字符串插值:

1
>>> print('The value of pi is approximately %5.3f.' % math.pi)

读写文件

open(filename, mode) 返回一个 file object

1
>>> f = open('workfile', 'w')

mode 可以是 ‘r’ 只读,‘w’ 只写,‘a’ 追加。‘r+’ 读写。默认为 ‘r’。

默认以 text mode 打开的:以指定的编码方式进行读写。编码格式默认值与平台相关。

在mode 中追加的 ‘b’ 则以 binary mode 打开文件:以字节的形式进行读写的。

在文本模式下读取时,默认会把平台特定的行结束符 (Unix 上的 \n, Windows 上的 \r\n) 转换为 \n。在文本模式下写入时,默认会把出现的 \n 转换回平台特定的结束符。这样在幕后修改文件数据对文本文件来说没有问题,但是会破坏二进制数据例如 JPEG 或 EXE 文件中的数据。请一定要注意在读写此类文件时应使用二进制模式。

with 关键字自动在子句结束后关闭文件:

1
2
3
4
5
6
>>> with open('workfile') as f:
...     read_data = f.read()

>>> # We can check that the file has been automatically closed.
>>> f.closed
True

没有使用 with 关键字,调用 f.close() 来关闭文件并立即释放它所使用的任何系统资源。

调用 f.write() 时未使用 with 关键字或未调用 f.close() 可能导致 f.write() 的参数没有完全写入到磁盘,即使程序是正常退出的。

文件对象的方法

假定已创建名为 f 的文件对象。

f.read(size)读取一些数据并将其作为字符串(在文本模式下)或字节串对象(在二进制模式下)返回。 size 被省略或者为负数时,将读取并返回整个文件的内容;如果文件的大小是你的机器内存的两倍就会出现问题。 当取其他值时,将读取并返回至多 size 个字符(在文本模式下)或 size 个字节(在二进制模式下)。 如果已到达文件末尾,f.read() 将返回一个空字符串 (’’)。

f.readline() 从文件中读取一行;换行符(\n)留在字符串的末尾,如果文件不以换行符结尾,则在文件的最后一行省略。空字符串"“表示已经到达了文件末尾,空行返回’\n’:

循环遍历文件对象读取行:

1
2
3
4
5
>>> for line in f:
...     print(line, end='')
...
This is the first line of the file.
Second line of the file

list(f)或 f.readlines()以列表的形式读取文件中的所有行

f.write(string) 会把 string 的内容写入到文件中,返回写入的字符数

1
2
>>> f.write('This is a test\n')
15

写入其他类型的对象之前,需要先把它们转化为字符串(在文本模式下)或者字节对象(在二进制模式下):

1
2
3
4
>>> value = ('the answer', 42)
>>> s = str(value)  # convert the tuple to string
>>> f.write(s)
18

f.tell() 返回二进制模式下从文件开始到当前位置的字节数

f.seek(offset, whence)改变文件对象的位置。offset 来计算位置,whence 参数指定参考点。 whence 的 0 值表示从文件开头起算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。 默认值为 0。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'

在文本文件中,只允许相对于文件开头搜索(使用 seek(0, 2) 搜索到文件末尾是个例外)并且唯一有效的 offset 值是那些能从 f.tell() 中返回的或者是零。其他 offset 值都会产生未定义的行为。

编码问题

文件打开时可以设置编码,excel并不能识别utf-8的文件,写csv文件时可以将编码改为gbk文件

1
2
with open("xxx","w",encoding='gbk') as f:
  ...

使用 json 保存结构化数据

将对象序列化为json字符串:

1
2
3
>>> import json
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'

dump() 将对象序列化为 text file :

1
json.dump(x, f)

load()解码text file 对象:

1
x = json.load(f)

Python3 字符串与hex之间的相互转换

bytes.fromhex(a):将十六进制串转换为二进制串

bytes.hex(a):将二进制串转换为十六进制串

 |