二进制文件(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库)