Python基础语法-菜鸟教程-第17章:Python3输入和输出

学习网址:https://www.runoob.com/python/python-basic-syntax.html
运行代码后即可生成笔记

未完成部分:pickle模块未看懂

#代码如下:

import sys
# chapter17:Python3 输入和输出
print("\nchapter17:Python3 输入和输出\n")
print("1.输出格式美化")
print("1)Python两种输出值的方式: 表达式语句和 print() 函数。")
print("2)第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。")
print("3)如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。")
print("4)如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。")
print("(1)str(): 函数返回一个用户易读的表达形式。")
print("(2)repr(): 产生一个解释器易读的表达形式。")
print("eg:")
print(">>> s = 'Hello, Runoob'\n"
">>> str(s)\n"
"'Hello, Runoob'\n"
">>> repr(s)\n"
"\"'Hello, Runoob'\"\n"
">>> str(1/7)\n"
"'0.14285714285714285'\n"
">>> x = 10 * 3.25\n"
">>> y = 200 * 200\n"
">>> s = 'x 的值为: ' + repr(x) + ',  y 的值为:' + repr(y) + '...'\n"
">>> print(s)\n"
"x 的值为: 32.5,  y 的值为:40000...\n"
">>> #  repr() 函数可以转义字符串中的特殊字符\n"
"... hello = 'hello, runoob\\n'\n"
">>> hellos = repr(hello)\n"
">>> print(hellos)\n"
"'hello, runoob\\n'\n"
">>> # repr() 的参数可以是 Python 的任何对象\n"
"... repr((x, y, ('Google', 'Runoob')))\n"
"\"(32.5, 40000, ('Google', 'Runoob'))\"")
print("\neg:两种方式输出一个平方与立方的表")
print(">>> for x in range(1, 11):\n"
"...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')\n"
"...     # 注意前一行 'end' 的使用\n"
"...     print(repr(x*x*x).rjust(4))\n"
"...\n"
      " 1   1    1\n"
      " 2   4    8\n"
      " 3   9   27\n"
      " 4  16   64\n"
      " 5  25  125\n"
      " 6  36  216\n"
      " 7  49  343\n"
      " 8  64  512\n"
      " 9  81  729\n"
"10 100 1000\n"

">>> for x in range(1, 11):\n"
"...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))\n"
"...\n"
      " 1   1    1\n"
      " 2   4    8\n"
      " 3   9   27\n"
      " 4  16   64\n"
      " 5  25  125\n"
      " 6  36  216\n"
      " 7  49  343\n"
      " 8  64  512\n"
      " 9  81  729\n"
"10 100 1000")
for x in range(1, 11):
    print("{0:1d} {1:2d} {2:3d}".format(x, x*x, x*x*x))
print("5)str.format() 的基本使用如下:")
print("(1)括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换。")
print("eg:")
print(">>> print('{}网址: \"{}!\"'.format('菜鸟教程', 'www.runoob.com'))\n"
"菜鸟教程网址: \"www.runoob.com!\"")
print("(2)在括号中的数字用于指向传入对象在 format() 中的位置,如下所示:")
print("eg:")
print(">>> print('{0} 和 {1}'.format('Google', 'Runoob'))\n"
"Google 和 Runoob\n"
">>> print('{1} 和 {0}'.format('Google', 'Runoob'))\n"
"Runoob 和 Google")
print("(3)如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数。")
print("eg:")
print(">>> print('{name}网址: {site}'.format(name='菜鸟教程', site='www.runoob.com'))\n"
"菜鸟教程网址: www.runoob.com")
print("(4)位置及关键字参数可以任意的结合:")
print("eg:")
print(">>> print('站点列表 {0}, {1}, 和 {other}。'.format('Google', 'Runoob', other='Taobao'))\n"
"站点列表 Google, Runoob, 和 Taobao。")
print("(5)!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化:")
print("eg:")
print(">>> import math\n"
">>> print('常量 PI 的值近似为: {}。'.format(math.pi))\n"
"常量 PI 的值近似为: 3.141592653589793。\n"
">>> print('常量 PI 的值近似为: {!r}。'.format(math.pi))\n"
"常量 PI 的值近似为: 3.141592653589793。")
print("(6)可选项 : 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。 下面的例子将 Pi 保留到小数点后三位:")
print("eg:")
print(">>> import math\n"
">>> print('常量 PI 的值近似为 {0:.3f}。'.format(math.pi))\n"
"常量 PI 的值近似为 3.142。")
print("(7)在 : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。")
print("eg:")
print(">>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}\n"
">>> for name, number in table.items():\n"
"...     print('{0:10} ==> {1:10d}'.format(name, number))\n"
"...\n"
"Google     ==>          1\n"
"Runoob     ==>          2\n"
"Taobao     ==>          3")
print("(8)如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :")
print("eg:")
print(">>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}\n"
">>> print('Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))\n"
"Runoob: 2; Google: 1; Taobao: 3")
print("(9)也可以通过在 table 变量前使用 ** 来实现相同的功能:")
print("eg:")
print(">>> table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}\n"
">>> print('Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))\n"
"Runoob: 2; Google: 1; Taobao: 3")
print("2.旧式字符串格式化")
print("1)% 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串.")
print("eg:")
print(">>> import math\n"
">>> print('常量 PI 的值近似为:%5.3f。' % math.pi)\n"
"常量 PI 的值近似为:3.142。")
print("3.读取键盘输入")
print("1)Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。")
print("2)input 可以接收一个Python表达式作为输入,并将运算结果返回。")
print("eg:")
print("str = input(\"请输入:\");\n"
"print (\"你输入的内容是: \", str)")
print("这会产生如下的对应着输入的结果:")
print("请输入:菜鸟教程\n"
"你输入的内容是:  菜鸟教程")
print("4.读和写文件")
print("1)open() 将会返回一个 file 对象,基本语法格式如下:open(filename, mode)")
print("(1)filename:包含了你要访问的文件名称的字符串值。")
print("(2)mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。")
print("不同模式打开文件的完全列表:")
print("模式	描述\n"
"r	以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。\n"
"rb	以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。\n"
"r+	打开一个文件用于读写。文件指针将会放在文件的开头。\n"
"rb+	以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。\n"
"w	打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。\n"
"wb	以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。\n"
"w+	打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。\n"
"wb+	以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。\n"
"a	打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。\n"
"ab	以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。\n"
"a+	打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。\n"
"ab+	以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。")
print("\n模式总结")
print("模式	        r	r+	w	w+	a	a+\n"
"读	            +	+		+		+\n"
"写		            +	+	+	+	+\n"
"创建			        +	+	+	+\n"
"覆盖			        +	+\n"		
"指针在开始	    +	+	+	+\n"		
"指针在结尾					    +	+")
print("\neg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"w\")\n"

"f.write( \"Python 是一个非常好的语言。\n是的,的确非常好!!\n\" )\n"

"# 关闭打开的文件\n"
"f.close()")
print("\n解析:")
print("第一个参数为要打开的文件名。第二个参数描述文件如何使用的字符。 mode 可以是 'r' 如果文件只读, 'w' 只用于写 (如果存在同名文件则将被删除), 和 'a' 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. 'r+' 同时用于读写。 mode 参数是可选的; 'r' 将是默认值。此时打开文件 foo.txt,显示如下:")
print("$ cat /tmp/foo.txt \n"
"Python 是一个非常好的语言。\n"
"是的,的确非常好!!")
print("5.文件对象的方法")
print("1)本节中剩下的例子假设已经创建了一个称为 f 的文件对象。")
print("2)f.read()")
print("(1)为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。")
print("(2)size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。")
print("eg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"r\")\n"

"str = f.read()\n"
"print(str)\n"

"# 关闭打开的文件\n"
"f.close()")
print("执行以上程序,输出结果为:")
print("Python 是一个非常好的语言。\n"
"是的,的确非常好!!")
print("3)f.readline()")
print("(1)f.readline() 会从文件中读取单独的一行。换行符为 '\n'。f.readline() 如果返回一个空字符串, 说明已经读取到最后一行。")
print("eg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"r\")\n"

"str = f.readline()\n"
"print(str)\n"

"# 关闭打开的文件\n"
"f.close()")
print("上述实例输出结果为:")
print("Python 是一个非常好的语言。")
print("4)f.readlines()")
print("(1)f.readlines() 将返回该文件中包含的所有行。")
print("(2)如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。")
print("eg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"r\")\n"

"str = f.readlines()\n"
"print(str)\n"

"# 关闭打开的文件\n"
"f.close()")
print("上述实例输出结果为:")
print("['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']")
print("5)另一种方式是迭代一个文件对象然后读取每行:")
print("eg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"r\")\n"

"for line in f:\n"
                       "    print(line, end='')\n"

"# 关闭打开的文件\n"
"f.close()")
print("上述实例输出结果为:")
print("Python 是一个非常好的语言。\n"
"是的,的确非常好!!")
print("6)f.write()")
print("(1)f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。")
print("eg:")
print("# 打开一个文件\n"
"f = open(\"/tmp/foo.txt\", \"w\")\n"

"num = f.write( \"Python 是一个非常好的语言。\\n是的,的确非常好!!\\n\" )\n"
"print(num)\n"
"# 关闭打开的文件\n"
"f.close()")
print("上述实例输出结果为:29")
print("(2)如果要写入一些不是字符串的东西, 那么将需要先进行转换:str()转换为字符串")
print("7)f.tell()")
print("(1)f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。")
print("8)f.seek()")
print("(1)如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。")
print("(2)from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:")
print("[1]seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符")
print("[2]seek(x,1) : 表示从当前位置往后移动x个字符")
print("[3]seek(-x,2):表示从文件的结尾往前移动x个字符")
print("(3)from_what 值为默认为0,即文件开头。")
print("eg:")
print(">>> f = open('/tmp/foo.txt', 'rb+')\n"
">>> f.write(b'0123456789abcdef')\n"
"16\n"
">>> f.seek(5)     # 移动到文件的第六个字节\n"
"5\n"
">>> f.read(1)\n"
"b'5'\n"
">>> f.seek(-3, 2) # 移动到文件的倒数第三字节\n"
"13\n"
">>> f.read(1)\n"
"b'd'")
print("9)f.close()")
print("(1)在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。")
print("(2)当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。")
print("eg:")
print(">>> f.close()\n"
">>> f.read()\n"
"Traceback (most recent call last):\n"
      "  File \"<stdin>\", line 1, in ?\n"
"ValueError: I/O operation on closed file")
print("(3)当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:")
print("eg:")
print(">>> with open('/tmp/foo.txt', 'r') as f:\n"
"...     read_data = f.read()\n"
">>> f.closed\n"
"True")
print("6.pickle 模块")
print("1)python的pickle模块实现了基本的数据序列和反序列化。")
print("2)通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。")
print("3)通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。")
print("4)基本接口:pickle.dump(obj, file, [,protocol])")
print("5)有了 pickle 这个对象, 就能对 file 以读取的形式打开:x = pickle.load(file)")
print("\neg1:")
print("import pickle\n"

"# 使用pickle模块将数据对象保存到文件\n"
"data1 = {'a': [1, 2.0, 3, 4+6j],\n"
"         'b': ('string', u'Unicode string'),\n"
"         'c': None}\n"

"selfref_list = [1, 2, 3]\n"
"selfref_list.append(selfref_list)\n"

"output = open('data.pkl', 'wb')\n"

"# Pickle dictionary using protocol 0.\n"
"pickle.dump(data1, output)\n"

"# Pickle the list using the highest protocol available.\n"
"pickle.dump(selfref_list, output, -1)\n"

"output.close()")
print("\neg2:")
print("import pprint, pickle\n"

"#使用pickle模块从文件中重构python对象\n"
"pkl_file = open('data.pkl', 'rb')\n"

"data1 = pickle.load(pkl_file)\n"
"pprint.pprint(data1)\n"

"data2 = pickle.load(pkl_file)\n"
"pprint.pprint(data2)\n"

"pkl_file.close()")

#代码运行结果如下:

chapter17:Python3 输入和输出

1.输出格式美化
1)Python两种输出值的方式: 表达式语句和 print() 函数。
2)第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
3)如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
4)如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
(1)str(): 函数返回一个用户易读的表达形式。
(2)repr(): 产生一个解释器易读的表达形式。
eg:

s = ‘Hello, Runoob’
str(s)
‘Hello, Runoob’

repr(s)
“‘Hello, Runoob’”

str(1/7)
‘0.14285714285714285’

x = 10 * 3.25
y = 200 * 200
s = 'x 的值为: ’ + repr(x) + ‘, y 的值为:’ + repr(y) + ‘…’
print(s)
x 的值为: 32.5, y 的值为:40000…

repr() 函数可以转义字符串中的特殊字符

… hello = ‘hello, runoob\n’

hellos = repr(hello)
print(hellos)
‘hello, runoob\n’

repr() 的参数可以是 Python 的任何对象

… repr((x, y, (‘Google’, ‘Runoob’)))
“(32.5, 40000, (‘Google’, ‘Runoob’))”

eg:两种方式输出一个平方与立方的表

for x in range(1, 11):
… print(repr(x).rjust(2), repr(xx).rjust(3), end=’ ')
… # 注意前一行 ‘end’ 的使用
… print(repr(x
x*x).rjust(4))

1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

for x in range(1, 11):
… print(’{0:2d} {1:3d} {2:4d}’.format(x, xx, xx*x))

1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
5)str.format() 的基本使用如下:
(1)括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换。
eg:

print(’{}网址: “{}!”’.format(‘菜鸟教程’, ‘www.runoob.com’))
菜鸟教程网址: “www.runoob.com!”
(2)在括号中的数字用于指向传入对象在 format() 中的位置,如下所示:
eg:

print(’{0} 和 {1}’.format(‘Google’, ‘Runoob’))
Google 和 Runoob

print(’{1} 和 {0}’.format(‘Google’, ‘Runoob’))
Runoob 和 Google
(3)如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数。
eg:

print(’{name}网址: {site}’.format(name=‘菜鸟教程’, site=‘www.runoob.com’))
菜鸟教程网址: www.runoob.com
(4)位置及关键字参数可以任意的结合:
eg:

print(‘站点列表 {0}, {1}, 和 {other}。’.format(‘Google’, ‘Runoob’, other=‘Taobao’))
站点列表 Google, Runoob, 和 Taobao。
(5)!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化:
eg:

import math
print(‘常量 PI 的值近似为: {}。’.format(math.pi))
常量 PI 的值近似为: 3.141592653589793。

print(‘常量 PI 的值近似为: {!r}。’.format(math.pi))
常量 PI 的值近似为: 3.141592653589793。
(6)可选项 : 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。 下面的例子将 Pi 保留到小数点后三位:
eg:

import math
print(‘常量 PI 的值近似为 {0:.3f}。’.format(math.pi))
常量 PI 的值近似为 3.142。
(7)在 : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。
eg:

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
for name, number in table.items():
… print(’{0:10} ==> {1:10d}’.format(name, number))

Google ==> 1
Runoob ==> 2
Taobao ==> 3
(8)如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :
eg:

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
print(‘Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}’.format(table))
Runoob: 2; Google: 1; Taobao: 3
(9)也可以通过在 table 变量前使用 ** 来实现相同的功能:
eg:

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
print(‘Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}’.format(**table))
Runoob: 2; Google: 1; Taobao: 3
2.旧式字符串格式化
1)% 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串.
eg:

import math
print(‘常量 PI 的值近似为:%5.3f。’ % math.pi)
常量 PI 的值近似为:3.142。
3.读取键盘输入
1)Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
2)input 可以接收一个Python表达式作为输入,并将运算结果返回。
eg:
str = input(“请输入:”);
print ("你输入的内容是: ", str)
这会产生如下的对应着输入的结果:
请输入:菜鸟教程
你输入的内容是: 菜鸟教程
4.读和写文件
1)open() 将会返回一个 file 对象,基本语法格式如下:open(filename, mode)
(1)filename:包含了你要访问的文件名称的字符串值。
(2)mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。
不同模式打开文件的完全列表:
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

模式总结
模式 r r+ w w+ a a+
读 + + + +
写 + + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +

eg:

打开一个文件

f = open("/tmp/foo.txt", “w”)
f.write( "Python 是一个非常好的语言。
是的,的确非常好!!
" )

关闭打开的文件

f.close()

解析:
第一个参数为要打开的文件名。第二个参数描述文件如何使用的字符。 mode 可以是 ‘r’ 如果文件只读, ‘w’ 只用于写 (如果存在同名文件则将被删除), 和 ‘a’ 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. ‘r+’ 同时用于读写。 mode 参数是可选的; ‘r’ 将是默认值。此时打开文件 foo.txt,显示如下:
$ cat /tmp/foo.txt
Python 是一个非常好的语言。
是的,的确非常好!!
5.文件对象的方法
1)本节中剩下的例子假设已经创建了一个称为 f 的文件对象。
2)f.read()
(1)为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
(2)size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
eg:

打开一个文件

f = open("/tmp/foo.txt", “r”)
str = f.read()
print(str)

关闭打开的文件

f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。
是的,的确非常好!!
3)f.readline()
(1)f.readline() 会从文件中读取单独的一行。换行符为 ’
'。f.readline() 如果返回一个空字符串, 说明已经读取到最后一行。
eg:

打开一个文件

f = open("/tmp/foo.txt", “r”)
str = f.readline()
print(str)

关闭打开的文件

f.close()
上述实例输出结果为:
Python 是一个非常好的语言。
4)f.readlines()
(1)f.readlines() 将返回该文件中包含的所有行。
(2)如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
eg:

打开一个文件

f = open("/tmp/foo.txt", “r”)
str = f.readlines()
print(str)

关闭打开的文件

f.close()
上述实例输出结果为:
['Python 是一个非常好的语言。
', '是的,的确非常好!!
']
5)另一种方式是迭代一个文件对象然后读取每行:
eg:

打开一个文件

f = open("/tmp/foo.txt", “r”)
for line in f:
print(line, end=’’)

关闭打开的文件

f.close()
上述实例输出结果为:
Python 是一个非常好的语言。
是的,的确非常好!!
6)f.write()
(1)f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
eg:

打开一个文件

f = open("/tmp/foo.txt", “w”)
num = f.write( “Python 是一个非常好的语言。\n是的,的确非常好!!\n” )
print(num)

关闭打开的文件

f.close()
上述实例输出结果为:29
(2)如果要写入一些不是字符串的东西, 那么将需要先进行转换:str()转换为字符串
7)f.tell()
(1)f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。
8)f.seek()
(1)如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。
(2)from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
[1]seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
[2]seek(x,1) : 表示从当前位置往后移动x个字符
[3]seek(-x,2):表示从文件的结尾往前移动x个字符
(3)from_what 值为默认为0,即文件开头。
eg:

f = open(’/tmp/foo.txt’, ‘rb+’)
f.write(b’0123456789abcdef’)
16

f.seek(5) # 移动到文件的第六个字节
5

f.read(1)
b’5’

f.seek(-3, 2) # 移动到文件的倒数第三字节
13

f.read(1)
b’d’
9)f.close()
(1)在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
(2)当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。
eg:

f.close()
f.read()
Traceback (most recent call last):
File “”, line 1, in ?
ValueError: I/O operation on closed file
(3)当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
eg:

with open(’/tmp/foo.txt’, ‘r’) as f:
… read_data = f.read()

f.closed
True
6.pickle 模块
1)python的pickle模块实现了基本的数据序列和反序列化。
2)通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
3)通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
4)基本接口:pickle.dump(obj, file, [,protocol])
5)有了 pickle 这个对象, 就能对 file 以读取的形式打开:x = pickle.load(file)

eg1:
import pickle

使用pickle模块将数据对象保存到文件

data1 = {‘a’: [1, 2.0, 3, 4+6j],
‘b’: (‘string’, u’Unicode string’),
‘c’: None}
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)
output = open(‘data.pkl’, ‘wb’)

Pickle dictionary using protocol 0.

pickle.dump(data1, output)

Pickle the list using the highest protocol available.

pickle.dump(selfref_list, output, -1)
output.close()

eg2:
import pprint, pickle
#使用pickle模块从文件中重构python对象
pkl_file = open(‘data.pkl’, ‘rb’)
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()

发布了25 篇原创文章 · 获赞 0 · 访问量 202

猜你喜欢

转载自blog.csdn.net/qq_33410995/article/details/104211442