Python系列-python文件操作
原链接:https://blog.csdn.net/m0_37745438/article/details/79573414
python提供了一系列方法来对文件进行读取、写入等操作
一、打开文件的方法
python 提供open方法来打开文件
1 open方式打开文件
你在操作的过程中可能会忘了关闭文件而释放资源。那么我们可以通过下面的方式让python
自动关闭释放文件,它就是with ….open
通过这种方法,当执行完with语句后系统将自动释放打开的文件。
二 文件打开模式
对于open(filename,arg) 中文件打开模式arg参数有以下几种方式:
序号 | 参数 | 说明 |
---|---|---|
1 | r | 只读 |
2 | r+ | 已读写的方式打开文件 |
3 | w | 已写入的方式打开文件,先删除文件原有内容,再写入新的内容。如果文件不存在,则创建一个新文件 |
4 | w+ | 已读写的方式打开文件,先删除文件原有内容,再写入新的内容。如果文件不存在,则创建一个新文件 |
5 | a | 已写入的方式打开文件,追加文件,不存在则创建一个新的文件 |
6 | a+ | 已读写的方式打开文件,追加文件,不存在则创建一个新的文件 |
7 | b | 已二进制模式打开文件,可与r,w,a一起结合使用 |
8 | U | 支持所有换行符,\n \r \r\n 都表示换行 |
三 文件操作函数
文件读操作
1. read() 读取文件中的所有内容,返回结果为字符串<str>
int为读取的长度,在 python 3.x 中read()带参数是读取的为字符长度
python 3.x:
2. readlines() 读取文件的所有内容,返回结果为列表类型<list>
1 with open(openfile, 'r') as f: 2 a = f.readlines() 3 print(type(a)) 4 print(a) 5 结果: 6 <class 'list'> 7 ['123456\n', '7890123']
3. readlines() 读取文件一行内容
4. tell() 返回当前指针在文件内容中的位置
5.seek(arg) 文件指针,arg参数为整型,代表在文件中的指针;seek(0) 文件开头,seek(1) 当前位置, seek(2)文件末尾
with open(openfile, 'r') as f: a = f.readline() # 读取一行内容 print(a) print(f.tell()) # 现在指针的位置 f.seek(0) # 返回到文件开始位置 a = f.readline() # 又从头开始读了 print(a)
注:seek方法对a, a+模式写文件时是不管用的,因为是追加模式,默认都会指向文件末尾
下面看一个实际应用例子,实现tail效果
1 import time 2 f = open('/home/ws/test','r') 3 f.seek(2)<span style="white-space:pre"> </span># 定位到文件末尾 4 while True: 5 currline = f.tell() # 获取当前位置 6 line = f.readline() # 读入内容 7 if not line: # 如果当前无信息 8 f.seek(currline) # 继续定位在最末尾 9 else: 10 print(line) # 输出内容 11 time.sleep(2)
四 文件写操作
6. write() 写文件,括号中的内容必须为str字符串类型,一次写入到文件中,如果字符串中有\n写入文件时也会换行
7. writeline() 写文件,除了可以写字符串类型外,还支持列表类型
8.truncate() 文件截断操作,将指针后面的所有内容截取掉
文件常用操作技巧:
1. 逐行读取文件内容
with open(openfile, 'r') as f: for line in f: print(line.strip())
2. 使用stat 获取文件的信息
通过stat模块可以获取文件的一些基本信息
import os import stat openfile = os.path.dirname(os.path.abspath("__file__")) + "\\README.md" file_stat = os.stat(openfile) # return tuple print("file_stat info: " ,file_stat) print("file_stat mode: " , file_stat.st_mode) print("check file is dir(stat): ", stat.S_ISDIR(file_stat.st_mode)) print("check file is file (os): ", os.path.isfile(openfile)) print("check file is file (stat):", stat.S_ISREG(file_stat.st_mode)) 结果: <span style="color:#ff6666;background-color: rgb(255, 255, 255);">file_stat info: os.stat_result(st_mode=33206, st_ino=844424930202057, st_dev=2417903304, st_nlink=1, st_uid=0, st_gid=0, st_size=9, st_atime=1452135600, st_mtime=1452135607, st_ctime=1452135600) file_stat mode: 33206 check file is dir(stat): False check file is file (os): True check file is file (stat): True</span>
stat 模块常用函数:
stat.S_ISREG(st_mode) == os.path.isfile(filename) # 判断是否一般文件
stat.S_ISDIR(st_mode) == os.path.isdir(filename) # 判断是否为文件夹
stat.S_ISLNK(st_mode) == os.path.islink(filename) # 判断是否链接文件
stat.S_ISSOCK(st_mode) # 判断是否套接字文件
stat.S_ISFIFO(st_mode) # 判断是否命名管道
stat.S_ISBLK(st_mode) # 判断是否块设备
stat.S_ISCHR(st_mode) # 判断是否字符设置
stat 模块常用属性
openfile = os.path.dirname(os.path.abspath("__file__")) + "\\README.md" file_stat = os.stat(openfile) # return tuple print("st_mode:", file_stat.st_mode) # 权限模式 print("st_ino:", file_stat.st_ino) # inode number print("st_dev:", file_stat.st_dev) # device print("st_size:", file_stat.st_size) # 文件的大小,以位为单位 print("uid:", file_stat.st_uid) # 所有用户的user id print("gid:", file_stat.st_gid) # 所有用户的group id print("st_atime:", file_stat.st_atime) # 文件最后访问时间 print("st_mtime:", file_stat.st_mtime) # 文件最后修改时间 print("st_ctime:", file_stat.st_ctime) # 文件创建时间 结果: st_mode: 33206 st_ino: 844424930202057 st_dev: 2417903304 st_size: 9 uid: 0 gid: 0 st_atime: 1452135600.2344666 st_mtime: 1452135607.5388844 st_ctime: 1452135600.2344666
3 从一个文件写入到另一文件
1 openfilepath = os.path.dirname(os.path.abspath("__file__")) 2 file1 = openfilepath + "\\1.txt" 3 file2 = openfilepath + "\\2.txt" 4 with open(file1,'r') as f1,open(file2,'a+') as f2: 5 f2.write(f1.read())