文件地输入输出
!!!个人主页:个人主页
!!!推荐一款模拟面试、刷题神器,从基础到大厂面试题:点击此处进入牛客网注册学习吧
!!!今日的努力,明日的未来
文件不单单指磁盘上地普通文件,也指任何抽象层面上地文件。所有地程序都要处理输入和输出,需要在非易失性介质上做持久化储存和检索数据,所以文件操作的重要性无需多言
读文本数据
f = open(filename,mode,buffering=-1,encode=None,errors = None)
- f是一个可迭代对象
- filename是要打开的文件名,非当前文件夹下的内容需要指明路径
- mode指明文件类型和操作的字符串(文件读取模式);通常是由两个字母组成
- buffering来设定缓冲模式,默认值为-1,即使用系统默认缓冲模式
- encoding用来指定文件编码、解码的编码类型,只针对文本文件有效,默认选择所在系统的编码方式
- errors 用来指定编码错误的处理方式。
mode第一个字母表示对文件的操作:
r
表示读模式。w
表示写模式。如果文件不存在则新建文件,如果文件存在则先清空在重写新内容。x
表示在文件不存在时新建并写入文件。a
表示如果文件存在,在文件末尾追加写入内容。
mode
第二个字母是文件类型:
t
(可省略)代表文本类型;b
表示二进制文件。
buffering参数模式:
0 不缓冲
1 只缓冲一行
value>1 缓冲区大小为value
value<0 使用系统默认缓冲机制
使用带有rt模式的open()函数读取文本文件
我们可以使用with open() as f
来作为上下文管理器,其主要作用: 保存、重置各种全局状态,锁住或解锁资源,关闭打开的文件等。自动关闭文件 。其他情况均需要手动关闭,即f.close
为了写入一个文本文件,使用带有wt
模式的open()
函数,如果之前文件有内容则清除并覆盖掉。
# 写入文本数据块
with open('somefile.txt', 'wt') as f:
f.write(text1)
f.write(text2)
pass
# 重定向打印语句
with open('somefile.txt', 'wt') as f:
print(line1, file=f)
print(line2, file=f)
pass
如果是在已存在文件中添加内容,使用模式at
。
文件的读写操作默认使用系统编码,可以通过调用sys.getdefaultencoding()
来得到。在大多数机器上面默认都是utf-8编码。如果你已经知道要读写的文本是其他编码方式,那么可通过传递一个可选的encoding
参数给open()
函数。
我们需要注意换行符的问题: Unix下是\n
,而Windows中是\r\n
用newline = ''
可以取消空白换行
打印输出到文件中
一般我们使用文件对象的write()
方法写入文本文件。它没有增加空格或者换行符。
f = open('allo.txt', 'wt')
print(f.write('Hello, world!')) # 返回写入文件的字节数
f.close()
另外,我们可以指定print()
函数的file
关键字参数,将其输出重定向到一个文件中。
with open('allo.txt', 'wt') as f:
print('Hello, world!', file=f)
这里需要注意的是文件必须以文本模式打开。print()
默认会在每个参数后面添加空格,在每行结束处添加换行。
读写二进制数据
使用模式为rb
或wb
的open()
函数来读取或写入二进制数据。
# 将整个文件当作一个字节字符串读取
with open('somefile.bin', 'rb') as f:
data = f.read()
# 将二进制数据写入文件
with open('somefile.bin', 'wb') as f:
f.write(b'Hello World')
在读取二进制数据时,所有返回的数据都是字节字符串格式的 ,所以 如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作。
文件不存在才能写入
当文件不存在时才能写入,不允许覆盖已存在的文件内容。
在open()
函数中使用x
模式来代替w
模式来进行处理,
如果文件是二进制的,使用xb
来代替xt
。
读取文件
-
read()
: 使用不带参数的read()
函数一次读入文件的所有内容。可以设置最大的读入字符数限制read()
函数一次返回的大小,如果没有给定size或者size为负数,文件将被读取直至末尾: 读到文件结尾之后,再次调用read()会返回空字符串(‘’)。 -
readline()
: 使用readline()
每次读入文件的一行,如果指定了size
,每次读取文件中size
个字节,返回一个字符串。如果没有给定size
或者size
为负数则返回一行(包括行结束符)。 对于文本文件,空行也有1字符长度(换行符\n
),当文件读取结束后,readline()
会返回空字符串 . 使用迭代器读取文件,每次返回一行。 -
readlines()
: 函数readlines()
读取剩余的所有的行(文件指针不一定在开始位置!)并将其以一个*字符串列表形式返回*。此方法一次性读取文件所有的内容至内存中,适用于小型文件。 -
writelines()
: 与readlines()
相反,可以使用file_obj.writelines()
来写入文件,它接收一个字符串列表作为参数并将其写入到文件中,每个字符串的行结束符不会被自动写入,通常适用于每个字符串末尾都包含换行符的字符串列表。
读写CSV数据
import csv
v = [
[1,2],
[3,4],
[5,6]
]
# 写入数据
with open('v.csv','wt',newline = '') as f:
csvout = csv.writer(f) # 创建csv模块中的writer(可写)对象
csvout.writerows(v)
# 读取数据
with open('v.csv','rt') as f:
csvin = csv.reader(f) # 创建csc模块中的reader(可读)对象
list = [row for row in csvin]
print(list)
将数据读取到字典中去(DictReader())
import csv
with open('stocks.csv') as f:
f_csv = csv.DictReader(f)
for row in f_csv:
# process row
pass
读取JSON数据
Python的json
模块提供了非常简单的方式来编码和解码 JSON(JavaScript Object Notation)数据。其中两个主要的函数是json.dumps()
和json.loads()
。
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data)
print(json_str[3])
print(type(data))
print(type(json_str))
# 写 JSON data
with open('data.json', 'w') as f:
json.dump(data, f)
# 读 data back
with open('data.json', 'r') as f:
data = json.load(f)
JSON编码支持的基本数据类型为None
,bool
,int
,float
和str
,以及包含这些类型数据的lists,tuples和dictionaries
序列化数据
序列化(serializing)即存储数据结构到一个文件中。Python提供了pickle
模块以特殊的二进制格式保存和恢复数据对象。
import pickle
import datetime
now1 = datetime.datetime.utcnow()
pickled = pickle.dumps(now1)
now2 = pickle.loads(pickled)
print(now1)
print(now2)
使用pickle.dump()
序列化数据到文件,而函数pickle.load()
用作反序列化。