引言
任何编程语言都需要和文件进行交互, 文件可以作为输入, 输出, 日志, 发挥着很重要的作用.
作为主流编程语言之一的Python
, 借助于多种内置或开源库, 可以读取和处理多种文件. 下面主要介绍其中几类文件的操作.
平台
- Win10
- Python3.6.7
txt文件
Python
内置的open
函数本身已经能处理不少文件类型, 不仅仅是txt
, 只要选对mode
, 甚至可以处理obj
, yaml
这类高度结构化的文件. 该函数原型为
open(name[, mode[, buffering]])
- name: 一个包含了你要访问的文件名称的字符串值.
- mode: mode 决定了打开文件的模式:只读, 写入, 追加等. 所有可取值见如下的完全列表. 这个参数是非强制的, 默认文件访问模式为只读r).
- buffering: 如果 buffering 的值被设为 0, 就不会有寄存. 如果 buffering 的值取 1, 访问文件时会寄存行. 如果将 buffering 的值设为大于 1 的整数, 表明了这就是的寄存区的缓冲大小. 如果取负值, 寄存区的缓冲大小则为系统默认.
至于具体的mode
对应的功能如下:
mode | 描述 |
---|---|
t | 文本模式(默认) |
x | 写模式,新建一个文件,如果该文件已存在则会报错 |
b | 二进制模式 |
+ | 打开一个文件进行更新可读可写) |
U | 通用换行模式(不推荐) |
r | 以只读方式打开文件文件的指针将会放在文件的开头这是默认模式 |
rb | 以二进制格式打开一个文件用于只读, 文件指针将会放在文件的开头. 这是默认模式一般用于非文本文件如图片等 |
r+ | 打开一个文件用于读写文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写文件指针将会放在文件的开头一般用于非文本文件如图片等 |
w | 打开一个文件只用于写入如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件 |
wb | 以二进制格式打开一个文件只用于写入如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件一般用于非文本文件如图片等 |
w+ | 打开一个文件用于读写如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件 |
wb+ | 以二进制格式打开一个文件用于读写如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件一般用于非文本文件如图片等 |
a | 打开一个文件用于追加如果该文件已存在,文件指针将会放在文件的结尾也就是说,新的内容将会被写入到已有内容之后如果该文件不存在,创建新文件进行写入 |
ab | 以二进制格式打开一个文件用于追加如果该文件已存在,文件指针将会放在文件的结尾也就是说,新的内容将会被写入到已有内容之后如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写如果该文件已存在,文件指针将会放在文件的结尾文件打开时会是追加模式如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加如果该文件已存在,文件指针将会放在文件的结尾如果该文件不存在,创建新文件用于读写 |
常用的有w
, w+
, wb
, wb+
, a
, a+
open
函数一般是按行对文件进行读取和写入的, 因此不论是读写, 都是按行进行操作的, 因此通常会和一个for
循环搭配. 如下
file = open("test.txt")
for line in file.readlines(): # 读取所有行
print(line.split('\r'))
file.close()
需要注意的是, open
不会处理每一行最后的换行符, 需要人为去给它屏蔽掉, win10下这个换行符是\r
上面的代码等价于
with open("test.txt") as file:
for line in file.readlines(): # 读取所有行
print(line.split('\r'))
这样不会忘记释放file
对象
yaml文件
yaml
文件主要是作为工程的cfg
配置文件, 给很多参数初始化赋值.
python
中有一个pyyaml
库, 可以实现yaml
文件的读取和写入.
读取
import yaml
fs = open("test.yaml", encoding="UTF-8")
data = yaml.load(fs, Loader=yaml.FullLoader)
fs.close()
此时, test.yaml
中的所有内容会以一个dict
的形式存入data
. 然后只要根据key
去索引就可以了.
写入
with open(fail_yaml, "a+", encoding="utf-8") as f:
out = SOME_DICT
yaml.dump(out, f)
这里写入的mode
同样由open(mode)
指定, 可以是删掉已存在的内容重写, 也可以在原有的文件中新增内容.
csv文件
提到Python
的文件操作怎么能不提pandas
, 这是一个功能十分强大的库. 这里只简单提一下怎么读写csv
文件.
读取
import pandas as pd
df = pf.read_csv("test.csv", sep=",", header=0)
df.head()
sep
参数表示按什么字符隔开, 通常来说csv
文件是用,
隔开的.header
参数表示表头有几行, 一般来说第一行会是表头, 不需要读取的, 那么就设置header=0
, 表示丢弃第一行.header=1
表示丢弃前两行. 如果这个文件不存在表头, 那就设置header=None
.
返回的df
是一个pandas
内置的DataFrame
类型, 实现了和numpy
的高度兼容, 甚至可以像处理数组矩阵那样去处理df
写入
df.to_csv("test.csv")