码迷,mamicode.com
首页 > 其他好文 > 详细

读写文本数据

时间:2017-08-05 07:15:59      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:sep   字符   文件系统   数据   否则   存在   hello   exist   系统   

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

问题:

  你想使用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(bHello 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 = bHello 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的数据: bHello 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(bbinary data)
4 data = s.getvalue()
5 print("数据类型:", type(data))
6 print("data的值:", data)

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

数据类型: <class bytes>
data的值: bbinary data

注意:

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

 

  

读写文本数据

标签:sep   字符   文件系统   数据   否则   存在   hello   exist   系统   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!