读写文本数据
Posted demon_gdy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读写文本数据相关的知识,希望对你有一定的参考价值。
使用其他分隔符或行终止符打印
问题:
你想使用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 实例并没有正确的整数类型的文件描述符。因此,它们不能在那些需要使用真实的系统级文件如文件,管道或者是套接字的程序中使用
以上是关于读写文本数据的主要内容,如果未能解决你的问题,请参考以下文章
背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”