一、文件的读写
读
在Python中用open()来打开一个文件,并返回一个流。
open(file, mode='r', buffering=-1, encoding=None, errors=None,
newline=None, closefd=True, opener=None)
打开文件并返回流。失败时引发OSError
file: 文件路径
mode: 文件的读写模式
buffering: 是否设置缓冲区,及缓冲区的大小
encoding: 所打开文件的编码方式
# 写一个文件,命名为text.txt,存储路径为C:/Users/ilgfc/Desktop/test.txt
# 在打开该文件时,要注意该文件的编码方式
# 未指定文件编码方式
>>> f = open("C:/Users/ilgfc/Desktop/test.txt")
>>> f.read()
'鍖椾含\n涓婃捣 娣卞湷 aaa\nthank you \n?\nwhat'
# 指定文件编码方式utf-8,因为源文件编码方式为utf-8
# read()返回一个字符串
# readlines()返回一个列表
>>> f = open("C:/Users/ilgfc/Desktop/test.txt", encoding = 'utf-8')
>>> f.read()
'北京\n上海 深圳 aaa\nthank you \n?\nwhat'
>>> f.readlines()
['北京\n', '上海 深圳 aaa\n', 'thank you \n', '?\n', 'what']
# 源文件编码方式为utf-16le,指定文件编码方式为utf-16le
# readline()每次读取一行,相当于一个迭代器,会记住当前迭代的位置
# readline()返回一个字符串
>>> f = open("C:/Users/ilgfc/Desktop/test1.txt", encoding = 'utf-16le')
>>> f.readline()
'\ufeff北京\n'
>>> f.readline()
'上海 深圳 aaa\n'
>>> f.readline()
'thank you \n'
>>> f.readline()
'?\n'
>>> f.readline()
'what'
>>> f.readline()
写
>>> f = open("C:/Users/ilgfc/Desktop/test.txt", 'a', encoding = 'utf-8')
>>> f.write('hello world\n技术与科学\n')
18
>>> f.close()
>>> f = open("C:/Users/ilgfc/Desktop/test1.txt", 'a', encoding = 'utf-
16le')
>>> f.write('\n中国上海\n科技\nhhh')
12
>>> f.close()
以上读取的都是文本文件,当需要读取二进制文件时,mode='rn',便可进行二进制文件的读取。
二、内存中字节的读取和字符串的读取
StringIO
# --------------读----------------
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('北京欢迎你')
5
>>> f.write('\n你好呀')
4
>>> print(f.getvalue())
北京欢迎你
你好呀
# --------------写----------------
>>> f = StringIO('北京欢迎你\n你好呀')
>>> f.read()
'北京欢迎你\n你好呀'
>>> f.close()
BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
请注意,写入的不是str,而是经过UTF-8编码的bytes。
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'