06-Python的文件操作

Posted cmn-note

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06-Python的文件操作相关的知识,希望对你有一定的参考价值。

# 文件基本知识

- 概念:
  - 文件是存储在外部介质上的数据集合,与文件名相关联。
  - 文件是操作系统管理和存储数据的一种方式。
- 文件相关知识:
  - Python使用内置的文件对象来处理文件。
  - 计算机的文件,就是存储在某种长期储存设备上的一段数据。
  - 按文件中数据的组织形式可以把文件分为文本文件和二进制文件两类。
    - 文本文件:
      - 存储的是常规字符串,也称ASCII文件,由文本行组成。
      - 把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式。
    - 二进制文件:
      - 按照对象在内存中的内容以字节串(bytes)进行存储。
      - 把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。
  - 文件的基本单位是字节,文件所含的字节数就是文件的长度。
  - 文件所含字节从文件头到文件为结束,每个字节有一个默认的位置,位置从0开始,直至结束。

  - 不论是二进制文件还是文本文件,指针的相对位置的计算都是以字节位单位。

# 打开和关闭文件

## 打开文件open()

  - 格式:文件变量名 = open(filename[,mode])
  - 第一个参数,文件的路径和名称
  - mode:表面文件打开的方式

    - r:只读方式。
      - 文件必须存在,否正抛出异常。
      - 文件指针指向文件开头,随着读写进行指针自行移动。
    - w:只写方式打开。
      - 文件不存在则创建文件。
      - 文件存在会覆盖以前的内容(清空文件内容)。
      - 文件指针指向文件结尾,随着读写进行指针自行移动。
    - a:以追加的方式对文件内容进行写入。
      - 文件不存在则创建文件。
      - 文件存在,写入的数据默认添加到文件末尾。
      - 文件指针指向文件结尾,随着读写进行指针自行移动。
    - +:用在文件末尾,表示打开文件后可同时进行读、写操作。

    - ‘r+‘/‘w+‘:读写方式打开,随着读写进行指针自行移动。
    - ‘a+‘:追加和读写方式打开。
    - s:创建方式打开。
    - t:文本方式打开。
    - b:binary方式,组合使用。
      - 文件模式中使用"b"表示访问二进制文件,否则为文本文件。
      - 组合键:rb、wb、ab、wb+、ab+,具体方法如上。

# f = open(fn)#以默认读写方式打开文件,与 (fn,‘r‘)相同
# f = open(file, ‘w‘) # 以写方式打开文件
# f = open(file, ‘w+‘) # 以写方式打开文件,同时可读
# f = open(file, ‘r+‘) # 以读方式打开文件,同时可写 

## 关闭文件:close()

  - 把缓冲区的内容写入磁盘,关闭文件,释放文件对象。
  - 文件打开了以后,一定要记得关闭。

# 打开方式
f1 = open(‘test01.txt‘, ‘w‘) # 以写的方式打开文件
# 关闭文件
f1.close() 

# 文件的写入

## 文本文件的写入

- write(xstring):将字符串写入到文件指针位置,返回写入的字符个数。

- writelines(sequence_of_strings):将由字符串所组成的列表或者迭代器写入到文件。

  * 案例write(xstring)

# 打开方式
f1 = open(‘file1.txt‘, ‘w‘) # 以写的方式打开文件
                                  # 若file1.txt不存在,则创建新文件   
s = "this is string"

f = f1.writelines(s)   # 将s写入文件file1.txt
print(f)        # 在终端打印写入字符串的长度
# 关闭文件
f1.close()

  * 案例writelines(sequence_of_strings)

# 打开方式
f1 = open(‘test01.txt‘, ‘w‘) 
s = "this is string","\nAAA","ddd"
f = f1.writelines(s)
# 关闭文件
f1.close()

## 二进制文件的写入

- 通过struct模块的pack():

  - 步骤:

    - (1)pack()将数字和布尔值转换成字符串(以字节为单位的字符串)。

    - (2)用write()方法写入二进制文件中,字符串则可以直接写入二进制文件中。

  - 语法:pack(格式串, 数字对象表)

    - 格式字符:

      c(string of length)、?(bool)、i(integer)、f(float)

import struct  # 导入sruct模块
x, y, z = 181818, 3.14, True
# 将整数、浮点数、布尔值依次转换位字符串
s1 = struct.pack("if?", x, y, z)
f = open(‘fb.dat‘, "wb")
f.write(s1)
# 关闭文件
f.close()

- 通过pickle模块的dump():

  - dump()方法直接把对象转换成字符串(bytes)并存入文件中。

  - 格式:dump(object,f)

    - 第一个参数object:对象名

    - 第二个参数 f 是文件对象

import pickle  # 导入sruct模块
x, y, z = 181818, 3.14, True
l = [1,23,[1,2]]
f = open(‘fb.dat‘, "wb")
pickle.dump(x,f)
pickle.dump(y,f)
pickle.dump(z,f)
pickle.dump(l,f)
# 关闭文件
f.close()

# 文件的读取

## 文本文件读取

- read():把整个文件读进一个字符串。读取所有内容。

- read(n):把n个字符读进一个字符串。

  - 文件大于n个字节,则只读取n个字节

  - 文件小于n个字节,则全部读取

- readline():把写一个换行符之前的内容全部读入一个字符串(读取一行),读出内容包括行位符号。

- readlines():把整个文件内容读入一个字符串列表,每一行位一个字符串。

## 二进制文件读取

- 二进制文件的读取应根据写入时的方法采取相应的方法进行读取。

  - 用struct模块的pack()方法完成转换而写入的文件

    - 字符串用read()方法读取。

    - 数字和布尔对象使用struct模块的unpack()方法还原。

      - 语法:unpack(格式串, 字符串表).

      - unpack()方法返回一个元组,元组的分量就是还原后的数据。

import struct  
x, y, z = 181818, 3.14, True
s1 = struct.pack("if?", x, y, z)
f = open(‘fb.dat‘, "wb")
f.write(s1) 
# 关闭文件
f.close()
f1 = open(‘fb.dat‘,‘rb‘)
sn = f1.read(9)  # 未经还原
print(sn)  
tu = struct.unpack(‘if?‘, sn)
print(tu)
f1.close()
# 结果
"""
b‘:\xc6\x02\x00\xc3\xf5H@\x01‘
(181818, 3.140000104904175, True)
"""

  - 用pickle模块的dump()方法完成转换而写入的文件

    - 使用pickle模块的load()方法

    - 语法:load(f)

    - 参数f时文件对象,该方法返回还原后的对象。

import pickle  
x, y, z = 181818, 3.14, True
l = [1,23,[1,2]]
n = 4 # 标志,标明要写入数据的个数
f = open(‘fb.dat‘, "wb")
pickle.dump(n,f)   # 写入数据的个数,便于遍历
pickle.dump(x,f)
pickle.dump(y,f)
pickle.dump(z,f)
pickle.dump(l,f)
# 关闭文件
f.close()
f1 = open(‘fb.dat‘, ‘rb‘)
n = pickle.load(f1) # 统计给定的文件数据个数
for i in range(n):
    x=pickle.load(f1)
    print(x)
f1.close()    
# 结果
"""
181818
3.14
True
[1, 23, [1, 2]]
"""

# 文件的操作

## 常用操作

- seek(offset[,whence]):

  - 功能:把文件指针移动到新位置

  - 参数:offset表示相对于whencce的位置,whence用于设置相对位置的起点。

    - 0:表示指向文件开头

    - 1:表示从当前位置开始

    - 2:表示从文件末尾开始

  - seek(n):将文件指针移动到第n个字节。

    - 从任意位置读取或者覆盖内容时,需要此操作。

    - 相当于whence省略,offset相对文件的开头位置。

# filename.seek(0) #定位文件指针到文件开头位置
# filename.seek(0, 2) # 指针移动到文件末尾,追加新内容时,需要此操作。 
a = "123456789abcdefg"
# 写入文件
with open(r"test01.txt", "w+") as f:
    f.write(a)  # 将a写入文件
    f.seek(2)  # 将指针位置移动到第三个字节位置
    f.write("三")
    f.seek(8)  # 将指针位置移动到第九个字节位置
    f.write("九")
    f.seek(0,2)  # 将指针位置移动到文件末尾位置
    f.write("G")
# 修改文件
with open(r"test01.txt", "r") as f:
    print(f.read())
# 结果
"""
12三5678九bcdefgG
"""

- tell():返回文件当前的位置。

  * 综合案例

a = "iiilllooovvveeeccc"
# 写入文件
with open(r"test01.txt", "w") as f:
    f.write(a)
# 读取文件    
with open(r"test01.txt", "r") as f:
    s = f.read(3)   # 读取三个字节
    pos = f.tell()   # 当前指针位置pos
    while s:     
        print(s,end=" ")     # 打印读取的内容
        print(pos)   # 打印当前指针位置
        # 继续读取,直到循环读取完毕
        s = f.read(3)
        pos = f.tell()
# 结果
"""
iii 3
lll 6
ooo 9
vvv 12
eee 15
ccc 18
"""

## 文件的复制

- 仅进行文本复制,二进制文件和文本文件都可以当作二进制文件处理。使用read()和write()方法实现。

a = "123456789abcdefg"
with open(r"test01.txt", "w") as f:
    f.write(a)
# 复制文件
try:
    f1 = open(r"test01.txt", "r")
    f2 = open(r"test02.txt", "w")
    s = f1.read()   # 读取f1的内容
    f2.write(s)    # 把f1的内容写入f2
except:
    print("出现异常")
finally:
    f1.close()
    f2.close()

with open(r"test02.txt", "r") as ff:
    print(ff.read())
# 结果
"""
123456789abcdefg
"""

- 使用shutil模块实现文件的复制.使用模块中的copyfile()函数实现复制文件。

import shutil
a = "123456789abcdefg"
with open(r"test01.txt", "w") as f:
    f.write(a)
# 将文件"test01.txt"复制到文件"test03.txt"
shutil.copy("test01.txt","test03.txt")
with open(r"test03.txt", "r") as ff:
    print(ff.read())
# 结果
"""
123456789abcdefg
"""   

## 文件的删除

- 使用os模块的remove()函数实现。

- os.path模块的exists()函数来确保被删除文件的存在。

import os,os.path
filename = "test01.txt"  
if os.path.exists(filename):# 确认文件是否存在
    os.remove(filename)   # 删除文件
else:
    print("%s文件不存在"%filename)

 

## os.path模块常用的文件处理函数:

abspath(path) 返回path所在的绝对路径
dirname(path) 返回目录的路径
exists(path) 判断文件是否存在
getatime(filename) 返回指定文件最近的访问时间
getctime(filename) 返回指定文件的创建时间
getmtime(filename) 返回指定文件最新的修改时间
getsize(filename) 返回指定文件的大小,单位i是字节
isabs(path) 判断指定路径是否位绝对路径
isfile(path) 判断指定路径是否存在且是一个文件
walk(top,func,arg) 遍历目录数

## os模块常用的文件处理函:

access(path) 按照mode指定的权限访问文件
chmod() 改变文件的访问权限
fatat(path) 返回打开的文件的所有属性
listdir(path) 返回path指定下的文件和目录
remove(path) 删除文件
rename(old,new) 将文件old重命名位new
stat(path) 返回path指定文件的所有属性
open() 打开文件

 

## 其他操作

- with...as 语句

  - 一种上下文管理协议的技术,自动判断文件的作用域,自动关闭不再使用的文件。

  - 可以利用这语句进行文件的读写等操作。

with open(r"test01.txt", "r") as f:
    for i in f:
        print(i)
# (1)打开文件test01.txt
# (2)将文件对象赋值给f
#(3)依次输出文件中的所有行
#(4)无论是否引发异常,都自动关闭文件。

- try...except...else....finally处理异常。 

f=open(‘filename‘,‘mode‘)    
try:
    # 文件进行的操作
except:    
    print(‘文件操作出现异常。‘)
finally:
    f.close()
# 无论怎么样,文件最后都会关闭

以上是关于06-Python的文件操作的主要内容,如果未能解决你的问题,请参考以下文章

06 python操作MySQL和redis(进阶)

06-python中的装饰器

1-06python列表类型不同操作的时间效率

Py3.X全栈-Day04-Linux文件目录权限及权限管理

06 Python字符编码与文件处理

人生苦短,我用Python(目录)