二进制文件(binary file) 操作模式:“b”
文本文件操作:
把文件的字节码自动转换为字符串,换行符会自动转换成'\n',默认文件中存储的都为字节数据,以行为单位进行分隔,在python内部统一用'\n'作为换行进行分隔
对文本文件读写需要用字符串(str)进行数据读取和写入
各种操作系统的换行
Linux换行符 : '\n'
Window换行符 : '\r\n'
旧的Macintosh换行符: '\r'
新的Mac Os 换行符 : '\n'
f.read()
从文件读取指定的字节流数,如果未给定或者为负则读取所有
# runoob.txt文件的内容是
# 1:www.runoob.com
# 2:www.runoob.com
# 3:www.runoob.com
# 4:www.runoob.com
# 5:www.runoob.com
fo = open("runoob.txt", "rw+") # 打开文件
print "文件名为: ", fo.name
line = fo.read(10)
print "读取的字符串: %s" % (line)
fo.close() # 关闭文件
# 文件名为: runoob.txt
# 读取的字符串: 1:www.runo
f.read()
f.readline()
从光标开始位置返回一行内容 返回
是
字符串
格式
1 try:
2 f = open("abc.txt")
3 print("文件打开成功!")
4 s = f.readline() # 读取一行数据
5 if s != '':
6 print("读取成功,文字是:", s)
7 else:
8 print("文件内已经没有数据可读了")
10 s = f.readline()
11 print("第二行数据是:", s)
12 s = f.readline()
13 print("第三行数据是:", s)
14 s = f.readline()
15 if s == '':
16 print("文件内已经没有数据可读取!")
17 else:
18 print('第四行数据是', s)
20 f.close()
21 except OSError:
22 print("文件打开失败")
f.readline()
1 文件打开成功!
2 读取成功,文字是:hello
4 第二行数据是:world
6 文件内已经没有数据可读取!
f.readlines()
以
列表
形式返回所有行内容
,换行符也会读到
1 try:
2 f = open('../exercise/info.txt')
3 L = f.readlines() # 返回所有行文字的列表
4 print(L)
5 f.close()
6 except OSError:
7 print("打开文件文件")
f.readlines()
1 ['张三 23 45\n', '历史 23 54']
f.close() 关闭,释放系统资源
f = open("haha.txt","
w
")
f.write("hello")
如果写入的文件有内容,会
清空
内容再写入
,
如果没有.txt文件,会先
创建
再写入
f = open('mynote.txt', 'w')
f.write('hello')
f.close()
以'a'模式打开文件并写入文件
追加
1 f = open('mynote.txt', 'a')
2 f.write('world')
3 f.close()
'a'模式打开并写入
F.writelines(lines)
将列表中的内容写入文件,内容要是
字符串
1 f = open('mynote.txt', 'w')
2 L = ['我是第一行\n', '我是第二行']
3 f.writelines(L)
4 f.close()
f.writelines(L)
文件流对象是可迭代对象,迭代过程中将以换行符'\n'作为分隔符,实例:
1 f = open('num.txt')
2 for line in f:
3 print(line) # 打印每一行的数据
标准输入输出文件
模块名 :sys sys.stdin:标准输入文件
sys.stdin.readline() 从键盘读入一行信息,回车结束
1 import sys
2 while True:
3 s = sys.stdin.readline()
4 if len(s) < 2:
5 break
6 print("刚刚读入",len(s),"字符")
7 print("s",s)
sys.stdin.readline()
1 dasd
2 刚刚读入 5 字符
3 s dasd
sys.stdin.read() 从键盘读入多行信息,ctrl + d 输入文件结束符
1 import sys
2 s = sys.stdin.read()
3 print(s)
4 print("程序结束")
sys.stdin.read()
1 dsda
2 fds
3 ^D
4 dsda
5 fds
8 程序结束
sys.stdout.wirte() (向屏幕终端打印信息) print就是默认sys.stdout.write
1 import sys
2 sys.stdout.write("hello")
3 sys.stdout.write(" ")
4 sys.stdout.write("world\n")
sys.stdout.write("****")
1 hello world
1 f = open("stdout.txt",'w')
2 print(1,2,3,4,sep='#',file = f)
print(1,2,3,4,sep='#',file = f)
1 1#2#3#4
sys.stderr.write() (向屏幕终端打印错误输出)
1 import sys
2 sys.stdout.write("我是标准输出\n")
3 sys.stderr.write("我是错误输出\n")
sys.stderr.write("*")
我是错误输出
我是标准输出
标准文件不需要打开和关闭就可以使用
二进制文件操作:
二进制文件操作模式字符:'b'
默认文件中存储的是以字节为单位的数据,二进制文件操作需要用字节串进行读写
f.read() / f.readline() / f.readlines() 返回类型
对于
文本文件
,f.read()等函数返回为
字符串(str)
对于
二进制文件
,f.read()等函数返回为
字节串(bytes)
以二进制方式读取文件内容
1 try:
2 f = open('abc.txt', 'rb')
3 # 读取数据,常用f.read读取
4 b = f.read(5) # <<== 5 代表5个字节(bytes)
5 print(b) #b'hello'
6 b = f.read(2)
7 print(b) #b'\xce\xd2'
8 b = f.read() # 不加实参读取全部字节,直至文件尾
9 print(b) #b'\xca\xc7\xb5\xda\xd2\xbb\xd0\xd0\r\n'
10 f.close()
11 except OSError:
12 print("打开文件失败!")
f = open('abc.txt', 'rb')
以二进制方式读取文件内容,然后再将其转换为字符串
1 try:
2 f = open('infos.txt', 'rb')
3 # 读取数据,常用f.read读取
4 b = f.read(5) # <<== 5 代表5个字节(bytes)
5 print(b) #b'hello'
6 b += f.read(2)
7 print(b) #b'hello\xe4\xb8'
8 b += f.read() # 不加实参读取全部字节,直至文件尾
9 print(b) #b'hello\xe4\xb8\xad\xe6\x96\x87'
10 print('读取的内容转为文字后为:', b.decode('utf-8'))
11 f.close() #读取的内容转为文字后为: hello中文
12 except OSError:
13 print("打开文件失败!")
f = open('infos.txt', 'rb')
F.write()对于二进制文件需要用字节串进行操作
1 try:
2 f = open("data.bin", 'wb')
3 # 在此处需要以字节串为单位进行写操作
4 f.write(b'\xe4') # '中'字的编码: e4 b8 ad
5 f.write(b'\xb8')
6 f.write(b'\xad')
7 f.write(b'\n\x41\x42\x43')
8 f.close()
9 except OSError:
10 print("文件打开失败!")
f = open("data.bin", '
w
b')
用
f.tell()
方法获取文件当前的读写位置(字节单位)
1 f = open('data.txt', 'rb')
2 print("当前的读写位置是:", f.tell()) # 0
3 b = f.read(5)
4 print("当前的读写位置是:", f.tell()) # 5
5 b = f.read() # 读取全部内容
6 print("文件最后的位置是:", f.tell()) # 20
7 f.close()
f.tell()
用F.seek(offset[,whence])方法来移动文件的读写指针位置(字节单位)
offset:开始的偏移量
大于0的数表示
向文件尾
开始移动偏移的
字节数
小于0的数表示
向文件头
开始移动偏移的
字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起
1代表从当前位置开始算起
2代表从文件末尾算起
1 f = open('data.txt', 'rb')
2 # 方法1
3 # f.seek(5, 0) # 相对于文件头向后移动5个字节
4 # 方法2
5 # f.seek(-15, 2) # 相对于文件尾向前移动15个字节
6 # 方法3
7 b = f.read(2) # 先读取2个字节
8 f.seek(3, 1) # 相对于当前位置向后移动3个字节
10 b = f.read(5)
11 print(b) # b'abcde'
13 f.close()
F.seek(offset, whence=0)
清空缓冲区
1 import time
3 f = open('infos.txt', 'w')
4 f.write('hello')
5 f.flush() # 强制清空缓冲区
7 # for i in range(10000):
8 # f.write('helloooooo')
9 # time.sleep(0.01)
11 print("程序开始睡觉...zzz")
12 time.sleep(15)
13 print("程序睡醒了,继续执行")
15 f.close()
f.flush()
汉字在UTF-8中占3个字节,在GBK中占两个字节
编码注释:
在python源文件的第一行或第二行写入如下内容:
# -*- coding:gbk -*-
# 设置源文件编码格式为gbk
或
# -*- coding:utf-8 -*-
# 设置源文件编码格式为utf-8
作用:
告诉解释执行器,此前文件的编码是什么?
CSV文件读写
CSV是英文Comma Separate Values(逗号分隔值)的缩写,顾名思义,文档的内容是由 “,” 分隔的一列列的数据构成的。CSV文档是一种编辑方便,可视化效果极佳的数据存储方式。而Python中有着非常强大的库可以处理这种文档,所以,如果你经常用Python处理数据的话,CSV文档当然是一种简单快捷的轻量级选择。下面我将以一个数据处理的例子入手,展现CSV文档的创建和编辑,以及Python是如何对CSV文档读写的。
读CSV文件
方法1:CSV库 读
import csv
with open("./data.csv", "r") as csvfile:
csv_reader = csv.reader(csvfile) # 返回一个生成器
for line in csv_reader:
print(line)
# ['name', 'age']
# ['orlen', '28']
# ['never', '27']
方法2:pandas库 读
import pandas
data = pandas.read_csv('./data.csv',sep=",")
print(data) # dataframe数据格式
# name age
# 0 orlen 28
# 1 never 27
for name, age in zip(data["name"], data["age"]):
print(name, age)
# orlen 28
# never 27
写CSV文件
方法1:CSV库 写
import csv
headers = ['name', 'age']
row_1 = ["orlen", '28']
row_2 = ["never", '27']
with open("data.csv", "w",newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(headers) # 写一行
writer.writerows([row_1, row_2]) # 写多行
name,age
orlen,14
never,15
data.csv
方法2:pandas库 写
import pandas
headers = ['name', 'age']
row_1 = ["orlen", '28']
row_2 = ["never", '27']
dataframe = pandas.DataFrame([row_1, row_2], columns=headers)
dataframe.to_csv("./data.csv", index=False, sep=',')
name,age
orlen,14
never,15
data.csv
还可以以字典的形式写入
import pandas
# name, site
name = ["Google", "Runoob", "Taobao", "Wiki"]
site = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
dict = {'name': name, 'site': site} # 字典
df = pandas.DataFrame(dict)
df.to_csv('./site.csv') # 保存 dataframe
,name,site
0,Google,www.google.com
1,Runoob,www.runoob.com
2,Taobao,www.taobao.com
3,Wiki,www.wikipedia.org
View Code
yaml文件读写
YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。
支持的数据类型:字典、列表、字符串、布尔值、整数、浮点数、Null、时间等
基本语法规则:
大小写敏感
使用缩进表示层级关系
相同层级的元素左侧对齐
键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
数组前加有 “-” 符号,符号与值之间需用空格分隔
None值可用null 和 ~ 表示
多组数据之间使用3横杠---分割
# 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错
import yaml
Data = {
"page": 1,
"msg": "地址",
"data": [
{"id": 1, "name": "学校"},
{"id": 2, "name": "公寓"},
{"id": 3, "name": "流动人口社区"}]
with open('./data.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data=Data, stream=f, allow_unicode=True)
data:
- id: 1
name: 学校
- id: 2
name: 公寓
- id: 3
name: 流动人口社区
msg: 地址
page: 1
data.yaml
import yaml
with open('./data.yaml', 'r', encoding='utf-8') as f:
result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result["data"])
# [{'id': 1, 'name': '学校'}, {'id': 2, 'name': '公寓'}, {'id': 3, 'name': '流动人口社区'}]
print(result["msg"]) # 地址
JSON文件读写
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析,更多 JSON 内容可以参考
JSON
教程。
Pandas 可以很方便的处理 JSON 数据,本文以 sites.json 为例,内容如下:
Pandas JSON
Python基础笔记1-Python读写yaml文件(使用PyYAML库)