python 读取或写入文件

  文件是数据存储的单位,文件中的数据以字节为单位进行顺序存储,汉字在GBK中占2个字节,在UTF-8中占3个字节

  文件的操作流程

  1. 打开文件
  2. 读/写文件
  3. 关闭文件

注意:任何操作系统,一个应用程序同时打开文件的数量有最大数限制的,所以要记得关闭文件

open方法

Python open() 方法用于打开一个文件,并返回文件对象。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

读取文件

f = open(file='mynote.txt', mode='r*', encoding=None)

参数

  • file:文件名或(相对/绝对)文件路径
  • mode:文件打开模式
  • encoding:python默认是ASCII编码,显示中文时会做一个ASCII到系统默认编码的转换,到时候会出错,所以一定要规定编码格式

返回:文件流对象

注意:如果打开文件失败,则会触发OSError错误

mode参数有

模式描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(Python 3 不支持)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

默认为文本模式,如果要以二进制模式打开,加上 b 。

文本文件操作:

把文件的字节码自动转换为字符串,换行符会自动转换成'\n',默认文件中存储的都为字节数据,以行为单位进行分隔,在python内部统一用'\n'作为换行进行分隔

  对文本文件读写需要用字符串(str)进行数据读取和写入

 f.read() :从文件读取指定的字节流数,如果未给定或者为负则读取所有

 f.readline() :从光标开始位置返回一行内容  返回是字符串格式

 f.readlines() :以列表形式返回所有行内容,换行符也会读到

关闭文件

  f.close()  关闭,释放系统资源

获取读的时候用with

with open(xxx) as f:
    ...

写入文件

f = open("haha.txt","w")
f.write("hello")

如果写入的文件有内容,会清空内容再写入,如果没有.txt文件,会先创建再写入

F.writelines(lines)  将列表中的内容写入文件,内容要是字符串

f = open('mynote.txt', 'w')
L = ['我是第一行\n', '我是第二行']
f.writelines(L)
f.close()

二进制文件操作

二进制文件操作模式字符:'b'

默认文件中存储的是以字节为单位的数据,二进制文件操作需要用字节串进行读写

f.read() / f.readline() / f.readlines() 返回类型

  • 对于 文本文件,f.read()等函数返回为 字符串(str)
  • 对于 二进制文件,f.read()等函数返回为 字节串(bytes)

以二进制方式读取文件内容,然后再将其转换为字符串

try:
    f = open('infos.txt', 'rb')
    # 读取数据,常用f.read读取
    b = f.read(5)  # <<== 5 代表5个字节(bytes)
    print(b)  # b'hello'
    b += f.read(2)
    print(b)  # b'hello\xe4\xb8'
    b += f.read()  # 不加实参读取全部字节,直至文件尾
    print(b)  # b'hello\xe4\xb8\xad\xe6\x96\x87'
    print('读取的内容转为文字后为:', b.decode('utf-8'))
    f.close()  # 读取的内容转为文字后为: hello中文
except OSError:
    print("打开文件失败!")

f = open('infos.txt', 'rb')

F.write()对于二进制文件需要用字节串进行操作

try:
    f = open("data.bin", 'wb')
    # 在此处需要以字节串为单位进行写操作
    f.write(b'\xe4')  # '中'字的编码: e4 b8 ad
    f.write(b'\xb8')
    f.write(b'\xad')
    f.write(b'\n\x41\x42\x43')
    f.close()
except OSError:
    print("文件打开失败!")

f = open("data.bin", 'wb')

f.tell()方法获取文件当前的读写位置(字节单位)

f = open('data.txt', 'rb')
print("当前的读写位置是:", f.tell())  # 0
b = f.read(5)
print("当前的读写位置是:", f.tell())  # 5

用 f.seek(offset[,whence]) 方法来移动文件的读写指针位置(字节单位)

  • offset:开始的偏移量

    • 大于0的数表示向文件尾开始移动偏移的字节数

    • 小于0的数表示向文件头开始移动偏移的字节数
  • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;

      0代表从文件开头开始算起

      1代表从当前位置开始算起

      2代表从文件末尾算起

f.seek(0)    # 将指针指向文件头

清空缓冲区 f.flush()

import time

f = open('infos.txt', 'w')
f.write('hello')
f.flush()  # 强制清空缓冲区

编码注释:

  在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、时间等

基本语法规则:

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 相同层级的元素左侧对齐
  4. 键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
  5. 数组前加有 “-” 符号,符号与值之间需用空格分隔
  6. None值可用null 和 ~ 表示
  7. 多组数据之间使用3横杠---分割
  8. # 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错

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库)

 

posted @ 2018-07-20 22:15  凌逆战  阅读(1111)  评论(0编辑  收藏  举报