• 运维特工,战胜心魔!!
  • 有些事情其实没有那么难,只是我们感觉难,走出第一步!
  • 你所浪费的今天,是昨天死去的人奢望的明天!!!
  • 欢迎访问 unixfbi.com 运维特工社区http://unixfbi.com/
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 运维特工:http://www.unixfbi.com
  • 人生没有白走的路,每一步都算数!!
  • 空杯心态,沉淀自己!

Python-文件处理

Python unixfbi 8个月前 (10-22) 1452次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

Python-文件处理

一、打开文件

1.open() 方法介绍

Python open()方法用于打开一个文件并返回文件对象,对文件的处理都需要用到这个函数。如果文件无法打开就会跑出异常。
使用open()方法必须要调用close()方法来保证关闭文件对象。
open()语法格式:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

一般我们都是直接open(file, mode='r')
参数说明:
file: 文件路径和文件名称(相对或者绝对路径),必需参数;
mode:打开文件的模式 r,w,a 等等,可选参数;
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)

buffering:设置缓冲;
0 表示无输出缓冲
1 表示使用缓冲
负数表示使用系统默认设置
正数表示使用指定大小的缓冲

encoding:指定编码,默认是没有设置,依赖平台编码;
errors:报错级别,默认没有设置。
newline:该参数只适用于文本模式。它可以是 None、'\n'、'\r'和'\r\n'。

2.文件的打开模式

mode 参数:
t:文本模式,默认值;
r:只读,默认值;open('/var/log/message','r')
w:写入,只能写不能读,从文件开头处写入,并会删除原内容;文件不存在会创建新文件。
a:追加不能读,从文件末尾处开始追加;指针在文件末尾;文件不存在会创建文件。
x:写模式,新建一个文件,如果该文件已经存在则会报错;

在模式后面使用'+' 表示同时支持输入、输出操作
例如
r+:打开一个文件用于读写。文件指针将会放在文件的开头。
w+:打开一个文件用于读写。文件存在就打开,并覆盖原有内容。如果文件不存在就创建文件。
a+:打开一个文件用于读写。以追加模式打开文件。文件存在,指针将移动到文件末尾处。文件不存在就创建。
在模式后附加'b'表示以二进制方式打开
例如 rb、wb+

3.文件操作的步骤

(1)以读方式打开文件用open('/dir/filename','r')
(2)可以使用read()等方法对文件进行操作;
(3)关闭文件file.close() 这里需要注意的是如果读写文件时出现错误,那么就无法执行file.close()方法了。文件就无法关闭。
正确写法:

try:
    f = open('/dir/filename','r')
    str = f.read()
    print(str)
finally:
    if f:
         f.close()

最简单的方法:

with open('/dri/filename','r') as f:
     str = f.read()
     print(str)

with 语句自动帮我们调用了close()方法
这样写更简单方便。所以以后我就用这种方法。

二、文件对象方法

f1 = open('/etc/passwd','r')
f1.read():从文件中读取指定的字节数,如果未指定 size 或者为负数则为读取所有内容。
read(self, size=-1, /)
Read at most n characters from stream.
Read from underlying buffer until we have n characters or we hit EOF.
If n is negative or omitted, read until EOF.

#!/usr/bin/env python3

with open('/etc/passwd','r') as f:
     str = f.read()
     print(str)

out: 输出每行内容

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

f1.readline([size=-1]): 从文件中每次读取一行内容。如果返回空字符串,表示读取到最后一行。size 和 read()中意义相同。

>>> f = open('/etc/passwd','r')
>>> f.readline()
'root:x:0:0:root:/root:/bin/bash\n'
>>> f.readline()
'bin:x:1:1:bin:/bin:/sbin/nologin\n'
>>> f.readline()
'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n'
>>> f.readline()
'adm:x:3:4:adm:/var/adm:/sbin/nologin\n'
>>> f.readline()
'lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\n'
>>> 

f1.readlines():读取所有行,以列表形式返回文件中所有行内容。

>>> f = open('/etc/passwd','r')
>>> f.readlines()              
['root:x:0:0:root:/root:/bin/bash\n', 'bin:x:1:1:bin:/bin:/sbin/nologin\n', 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n', 'adm:x:3:4:adm:/var/adm:/sbin/nologin\n', 'lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\n', 'sync:x:5:0:sync:/sbin:/bin/sync\n', 'shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\n', 'halt:x:7:0:halt:/sbin:/sbin/halt\n', 'mail:x:8:12:mail:/var/spool/mail:/sbin/nologin\n', 'operator:x:11:0:operator:/root:/sbin/nologin\n', 'games:x:12:100:games:/usr/games:/sbin/nologin\n', 'ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin\n']

read(),readline(),readlines()区别:
read():会一次性读取文件的全部内容,如果文件比较大,会把内存填满。
readline():每次读取一行内容。
readlines():一次性读取所有内容并以列表形式返回所有内容。
f1.write(): 将字符串写入到文件中,然后返回写入的字符数;

>>> f = open('123.log','w')
>>> f.write('abcdef')
6

f1.writelines(): 向文件吸入一个序列字符串。

#!/usr/bin/env python3

with open('123.log','w+') as f:
     f.writelines('123\n456\n789\n')
     f.seek(0,0)  #回到文件开头位置
     str = f.read()
     print(str)

文件内容:

$ cat 123.log 
123
456
789

文件位置:
f.tell(): 方法会告诉我们指针现在所在文件中的位置(从文件开头计算),是字节数,在多少字节的位置。
f.seek(offset [,whence])方法改变当前文件的位置。offset 变量表示要移动的字节数,whence 变量表示指定从什么位置开始偏移。
0,将从文件开头开始作为参考位置;
1,使用当前位置作为参考位置;
2,文件末尾将作为参考位置;

例如:
seek(x,0):从文件首行首字符开始移动 x 个字符;
seek(x,1):表示从当前位置向后移动 x 个字符;
seek(-x,2):表示从文件结尾向前移动 x 个字符;

>>> f = open('123.log','wb+')
>>> f.write(b'123456789ABC') 
12
>>> f.seek(5) #移动到文件第 6 个字节
5
>>> f.tell()  #查看当前位置
5
>>> f.read(1) #获取位置上的值
b'6'
>>> f.seek(-3,2)  #移动到文件倒数第 3 个字节
9
>>> f.read(1)  # 读取倒数第 3 个字节的值
b'A'

f.truncate(self, pos=None, /):从文件首行首字符开始截断,pos 表示多少个字符,无 pos 表示从当前位置开始截取,截断之后后面的所有字符被删除。


UnixFBI 运维特工 , 版权所有丨如未注明 , 均为原创丨 转载请务必注明原文链接http://www.unixfbi.com/583.html
喜欢 (0)
[支付宝]
分享 (0)
unixfbi
关于作者:
运维工程师一枚,做有价值的事情!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址