Python文件操作与文件编码方式

学习地址

目标

  1. 文件概念
  2. 基本操作
  3. 文件/文件夹常用操作
  4. 文本文件的编码方式

概念

  1. 计算机的文件,就是存储在某种长期储存设备上的一段数据
  2. 文件能将数据长期保存下来,在需要的是时候使用
存储方式
  1. 文本文件

    • 可以使用文本编辑软件查看
    • 本质上还是二进制文件
  2. 二进制文件

    • 保存的二进制数据,提供给其他软件使用
    • 不能使用文本编辑软件查看

基本操作

  1. 打开文件
  2. 读写文件(读入内存,写入文件)
  3. 关闭文件
操作方法

Python中操作文件一个函数三个方法

  1. open: 打开文件,并且返回文件操作对象
  2. read: 将文件内容读取到内存
  3. write: 将指定内容写入文件
  4. close:关闭文件

open函数负责打开文件,并且返回文件对象;read/write/close三个方法都需要通过文件对象来调用

read方法

open函数的第一个参数是要打开的文件名(区分大小写)
如果文件存在则返回文件操作对象(读写指针),否则抛出异常

read方法可以一次性读入并返回文件的所有内容
close方法负责关闭文件,如果忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问

注意: 方法执行后,会把文件指针移动到文件末尾

1
2
3
4
5
6
7
8
9
# 打开文件
fid=open('file_path')

# 读取
text=fid.read()
print(text)

# 关闭
fid.close()

在开发中,通常会先编写打开和关闭的代码,再编写中间针对文件的编写

文件指针

文件指针标记从哪个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置
当执行了read方法后,文件指针会移动到读取内容的末尾

  • 默认情况下会移动到文件末尾

如果执行了一次read后,再次掉用无法读取到任何内容了

打开文件的方式

open函数默认以只读方式打开文件,并且返回文件对象
语法:

1
fid=open("文件路径","访问方式")

关于访问方式:

  • r 只读,文件不存在则抛出异常
  • w 只写,如果文件不存在则创建新文件
  • a 追加,文件指针指向文件末尾,如果文件不存在则创建新文件
  • r+ 读写,如果指针指向文件开头,文件不存在则抛出异常
  • w+ 读写,如果文件存在会被覆盖,如果文件不存在创建新文件
  • a+ 读写,文件指针指向文件末尾,文件不存在则创建新文件进行写入

Tips:频繁地移动文件指针会影响文件地读写效率,开发中更多以只读、只写方式来操作文件

readline按行读取
  • read方法默认会把文件地所有内容一次性读取到内存
  • 如果文件太大,对内存地占用非常严重
  • readline方法一次读取一行内容
  • 方法执行后,文件指针移动到下一行,准备再次读取

读取大文件地正确姿势:

1
2
3
4
5
6
fid=open('file_path')
while True:
text=fid.readline()
if not text:break
print(text,end="")
fid.close()

文件读写案例

目标: 实现文件复制
如果是小文件复制,直接read完整内容就可以;如果是大文件,则按行读取按行写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 先创建文件手动添加内容
# fid=open('haha1','w')
# fid.write('123')
# fid.write('\n')
# fid.write('456')
# fid.close()

# 小文件复制
fid=open('haha1','r')
fid2=open('haha2','w')
text=fid.read()
fid2.write(text)
# print(text)
fid.close()
fid2.close()

# 大文件复制
fid=open('haha1','r')
fid2=open('haha2','w')
while True:
text=fid.readline()
if not text:break
fid2.write(text)

fid.close()
fid2.close()

导入os模块执行文件和目录管理操作

在终端/文件浏览器中可以执行常规地文件/目录管理操作:创建、重命名、删除、更改路径、查看…
Python中,如果希望通过程序实现上述功能,需要导入os模块

文件操作
  • rename 重命名文件,os.rename(源文件名,目标文件名)
  • remove 删除文件, os.remove(文件名)
目录操作
  • listdir :目录列表,print(os.listdir('.'))
  • mkdir:创建目录,os.mkdir(目录名)
  • rmdir:删除目录,os.rmdir(目录名)
  • getcwd:获取当前目录,os.getcwd()
  • chdir: 修改工作目录, os.chdir(目标目录)
  • path.isdir:判断是否文件,os.path.isdir(文件路径)

Tips:文件或目录都支持相对路径和绝对路径

1
2
3
4
5
6
7
8
9
import os
print(os.getcwd())
print(os.listdir('.'))
print(os.path.isdir('ML'))

- - - - - - - - - - - - -
/home/liuyuqiang0/PycharmProjects/LYQ_YES
['.idea', '__pycache__', 'lyq.py', 'craw', 'Creat_pictures', 'ML', 'haha1', 'haha2']
True

文本编码

文本文件存储的内容是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等

  • Python2.x默认使用ASCII编码`
  • Python3.x默认使用UTF-8编码
ASCII编码与UNICODE编码

ASCII编码

  • 计算机中只有256个ASCII字符
  • 一个ASCII在内存中占用1个字节,即2**8种字符
  • 详见`ASCII`表

UTF-8编码格式

  • 计算机种使用1-6个字节来表示一个UTF-8字符,涵盖地球上几乎有所地区的文字
  • 大多数汉字会使用3个字节表示
  • UTF-8UNICODE编码的一种编码格式
Python2.x中使用中文

在程序第一行增加以下代码,解释器会以utf-8编码来处理Python文件

1
#-*-coding:utf-8-*-

或者

1
# coding=utf8

unicode字符串

  • Pyhton2.x中,即使指定了文件使用UTF-8的编码格式,但是在遍历字符串时,仍然会以字节为单位遍历字符串
  • 要能够正确的遍历字符串,在定义字符串时,需要在字符串的引号前,增加一个小写字母u,告诉解释器这是一个unicode字符串
  • 9012年,建议使用Python3.X(X≥5)