原链接:https://blog.csdn.net/m0_37745438/article/details/79573414

python提供了一系列方法来对文件进行读取、写入等操作

一、打开文件的方法

python 提供open方法来打开文件

1 open方式打开文件

1 openfile = os.path.dirname(os.path.abspath("__file__")) + "\\source.txt"  
2 f = open(openfile,'r')  
3 print(f.read())  
4 f.close()  

 

你在操作的过程中可能会忘了关闭文件而释放资源。那么我们可以通过下面的方式让python

自动关闭释放文件,它就是with ….open

openfile = os.path.dirname(os.path.abspath("__file__")) + "\\source.txt"  
with open(openfile,'r') as f:  
    print(f.read())  

 

通过这种方法,当执行完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> 

openfile = os.path.dirname(os.path.abspath("__file__")) + "\\source.txt"  
with open(openfile, 'r') as f:  
    a = f.read()  
    print(type(a))  
    print(a)  
结果:  
<class 'str'>  
123456  
7890123  

 

read也可以支持读取指定长度的内容,方法为 read(int)

int为读取的长度,在 python 3.x 中read()带参数是读取的为字符长度

python 3.x:

# ttt.txt内容:你123abcd  
a = open('ttt.txt', 'r', encoding='utf-8')  
print(a.tell())   # 结果:0  
print(a.read(3))  # 结果:你12  
print(a.tell())   # 结果:5  

 

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()      写文件,除了可以写字符串类型外,还支持列表类型 

1 openfile = os.path.dirname(os.path.abspath("__file__")) + "\\source3.txt"  
2 c_lines = ["abcdefg\n","higjksldf\n","dki29dfa\n"]  
3 c_str = "abcde\nssss\nccccc"  
4 with open(openfile, 'a+') as f:  
5     f.writelines(c_lines)  
6     f.write(c_str)  

 

8.truncate()      文件截断操作,将指针后面的所有内容截取掉

1 with open(openfile, 'r+') as f:  
2     print(f.read())  
3     f.seek(5)   # 指针到位置5  
4     c = f.truncate()  # 截取  
5     f.seek(0)    # 指针到文件开头  
6     print(f.read())  
7 结果:  
8 1234567890123  
9 12345  

 

文件常用操作技巧:

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

 

版权声明:本文为ls-2018原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ls-2018/p/8780922.html