首页 > 其他 > 详细

读写文本数据

时间:2017-08-05 00:49:07      阅读:234      评论:0      收藏:0      [点我收藏+]

使用其他分隔符或行终止符打印

问题:

  你想使用print() 函数输出数据,但是想改变默认的分隔符或者行尾符。

解决方案:

  可以使用在print() 函数中使用sep 和end 关键字参数,以你想要的方式输出。比如:

 1 #正常输出
 2 print(‘dmeon‘, 89 , 8, 23)
 3 
 4 #指定分隔符,
 5 print(‘dmeon‘, 89 , 8, 23, sep=‘,‘)
 6 
 7 #指定结尾符号
 8 print(‘dmeon‘, 89 , 8, 23, sep=‘,‘,end=‘!!!\n‘)
 9 
10 #使用end 参数也可以在输出中禁止换行。比如:
11 for i in range(5):
12     print(i, end=‘ ‘)
13 
14 #另外一种添加分隔符的方法
15 print()
16 print(‘分隔符的方法‘.center(30, ‘-‘))
17 s1 = (‘dmeon‘, 89 , 8, 23)
18 result = ‘ ‘.join((str(s) for s in s1))
19 print(result)
20 
21 #高逼格的方法
22 print("s1的值", s1)
23 print(‘高逼格的输出方式‘, *s1,sep=‘,‘)

以上代执行输出的结果为:

dmeon 89 8 23
dmeon,89,8,23
dmeon,89,8,23!!!
0 1 2 3 4 
------------分隔符的方法------------
dmeon 89 8 23
s1的值 (‘dmeon‘, 89, 8, 23)
高逼格的输出方式,dmeon,89,8,23

 

读写字节数据

问题:

  你想读写二进制文件,比如图片,声音文件等等

解决方案:

  使用模式为rb 或wb 的open() 函数来读取或写入二进制数据。比如:

 1 #使用with打开文件,不需要考虑文件close的问题,rb模式是使用读二进制的模式打开
 2 with open(‘/tmp/go.pdf‘, ‘rb‘) as f:
 3     #获取文件中的内容
 4     data = f.read()
 5 
 6 #wb是写的二进制模式打开,当文件存在会覆盖文件已有的内容,文件不存在会创建
 7 with open(‘/tmp/test.bin‘,‘wb‘) as f:
 8     f.write(b‘Hello World‘)
 9 
10 #天坑,读取二进制数据的时候,字节字符串和文本字符串的语义差异可能会导致一个潜在的陷阱
11 t = ‘Hello World‘
12 print("t中0索引第一个元素为:", t[0])
13 
14 #循环t并打印每个元素
15 for i in t:
16     print(‘循环t中的每个元素:‘, i)
17 
18 #坑的地方来了
19 print(‘*‘*30)
20 b = b‘Hello World‘
21 print(‘b中0索引的元素:‘, b[0])
22 
23 #循环bytes类型b变量中的每个元素
24 for x in b:
25     print(‘循环b中的每个元素:‘, x)

以上代执行输出的结果为:

t中0索引第一个元素为: H
循环t中的每个元素: H
循环t中的每个元素: e
循环t中的每个元素: l
循环t中的每个元素: l
循环t中的每个元素: o
循环t中的每个元素:  
循环t中的每个元素: W
循环t中的每个元素: o
循环t中的每个元素: r
循环t中的每个元素: l
循环t中的每个元素: d
******************************
b中0索引的元素: 72
循环b中的每个元素: 72
循环b中的每个元素: 101
循环b中的每个元素: 108
循环b中的每个元素: 108
循环b中的每个元素: 111
循环b中的每个元素: 32
循环b中的每个元素: 87
循环b中的每个元素: 111
循环b中的每个元素: 114
循环b中的每个元素: 108
循环b中的每个元素: 100

如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作。比如:

1 with open(‘/tmp/test.bin‘, ‘rb‘) as f:
2     data = f.read(16)
3     print(‘data的数据类型:‘, type(data))
4     print(‘data的数据:‘, data)
5 
6     text = data.decode(‘utf-8‘)
7     print(‘data转码以后的数据类型:‘, type(text))
8     print(‘text的数据:‘, text)

以上代执行输出的结果为:

data的数据类型: <class ‘bytes‘>
data的数据: b‘Hello World‘
data转码以后的数据类型: <class ‘str‘>
text的数据: Hello World

 

文件不存在才能写入

问题:

  你想像一个文件中写入数据,但是前提必须是这个文件在文件系统上不存在。也就是不允许覆盖已存在的文件内容

解决方案:

  可以在open() 函数中使用x 模式来代替w 模式的方法来解决这个问题。比如:

 1 #如果文件存在,会覆盖内容,如果文件不存在会创建文件并写入内容
 2 with open(‘/tmp/test.bin‘, ‘wt‘) as f:
 3     f.write(‘Hello\n‘)
 4 
 5 #如果文件存在,会报异常,否则创建文件并写入内容,如果文件是二进制,使用wb代替
 6 try:
 7     f = open(‘/tmp/test.bin‘, ‘xt‘)
 8 except Exception as e:
 9     print(e)
10 else:
11     f.write(‘Hello\n‘)
12 finally:
13     f.close()

以上代执行输出的结果为:

[Errno 17] File exists: ‘/tmp/test.bin‘

 

字符串的I/O 操作

问题:

  你想使用操作类文件对象的程序来操作文本或二进制字符串

解决方案:

  使用io.StringIO() 和io.BytesIO() 类来创建类文件对象操作字符串数据。比如:

 1 import io
 2 
 3 s = io.StringIO()
 4 print(s.write(‘Hello World\n‘))
 5 
 6 print(‘This is a test‘, file=s)
 7 
 8 #获取s中的内容
 9 content = s.getvalue()
10 print(‘s中的内容为:‘, content)
11 
12 #读取5个长度的内容
13 s = io.StringIO(‘Hello\nWorld\n‘)
14 print("五个字符的内容:")
15 print(s.read(5))
16 
17 #读取剩余的内容
18 print("剩余的内容:")
19 print(s.read())

以上代执行输出的结果为:

12
s中的内容为: Hello World
This is a test

五个字符的内容:
Hello
剩余的内容:

World

io.StringIO 只能用于文本。如果你要操作二进制数据,要使用io.BytesIO 类来代替。比如:

1 import io
2 s = io.BytesIO()
3 s.write(b‘binary data‘)
4 data = s.getvalue()
5 print("数据类型:", type(data))
6 print("data的值:", data)

以上代执行输出的结果为:

数据类型: <class ‘bytes‘>
data的值: b‘binary data

注意:

  需要注意的是, StringIO 和BytesIO 实例并没有正确的整数类型的文件描述符。因此,它们不能在那些需要使用真实的系统级文件如文件,管道或者是套接字的程序中使用

 

  

读写文本数据

原文:http://www.cnblogs.com/demon89/p/7288349.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!