python--文件的读写操作

Posted GAO6

tags:

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

Python提供了必要的函数和方法进行默认情况下的文件基本操作

文件打开方式:

open(name[,mode[buf]]) name:文件路径 mode:打开方式 buf:缓冲buffering大小

 

文件读取方式:

read([size]):读取文件(读取size字节,默认读取全部)

readline([size]):读取一行

readline([size]) :读取缓冲buf(io.DEFAULT_SET_BUFFER),返回每一行所组成的列表

iter:使用迭代器遍历读取文件 f.open(name);iter_f = iter(f);用for line in iter_f循环迭代器

with open(\'pi_digits.txt\') as f: # 默认模式为‘r’,只读模式

contents = f.read() # 读取文件全部内容

 

文件写入方式:

write(str):将字符串写入文件

writelines(sequence_of_strings):写多行到文件,参数为可迭代的对象

当调用write(str)时,python解释器调用系统调用想把把内容写到磁盘,但是linux内核有文件缓存机制,所以缓存到内核的缓存区,当调用close()或flush()时才会真正的把内容写到文件

或者写入数据量大于或者等于写缓存,写缓存也会同步到磁盘上

关闭文件的目的

1:写缓存同步到磁盘

2:linux系统中每个进程打开文件的个数是有限的

3:如果打开文件数到了系统限制,在打开文件就会失败

python文件指针的操作:

seek(offset[,whence])移动文件指针

offset:偏移量,可以为负数

whence:偏移相对位置

python文件指针的定位方式:

os.SEEK_SET 相对于文件的起始位置 0

os.SEEK_CUR 相对于文件的当前位置 1

os.SEEK_END 相对于文件的结尾位置 2

Python 文件属性:

file.fileno(): 文件描述符;

file.mode: 文件打开权限;

file.encoding: 文件编码方式;

file.closed: 文件是否关闭;

Python 标准文件:

标准输入文件:sys.stdin; 只读 描述符为0

标准输出文件:sys.stdout; 只写 描述符为1

标准错误文件:sys.stderr; 只写 描述符为2

Python 命令行参数:

sys模块提供sys.argv属性,通过该属性可以得到命令行参数。sys.argv是一个字符串序列,保存着命令行的参数,其中sys.argv[0]是文件名,1~n是真正的参数

Python 文件编码方式

Python文件默认的编码格式是ASCII格式,要写入中文可以将编码格式进行转换

1. a = unicode.encode(u\'你好\', \'utf-8\') 转换, 一个汉字在ASCII码中占3字节,在unicode中占2字节。

2. 直接创建utf-8格式的文件。使用codecs模块提供的方法创建指定编码格式文件:

codecs.open(fname, mode, encoding, errors, buffering): 使用指定编码格式打开文件

3. 使用系统提供的open()函数也可以创建指定编码格式的文件:

open(file, mode=\'r\', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Linux文件系统简单示意图


下面是python操作文件的流程

 

python基础 3.0 file 读取文件

 
一.python  文件访问
1.在python中要访问文件,首先要打开文件,也就是open
r:  只读
w:  只写 ,文件已存在则清空,不存在则创建
a:追加 ,写到文件末尾。如果文件存在,则在文件最后去追
    加。文件不存在就去创建   
+-:更新(可读可写)
 
r+ :以读写模式打开
w+ :以读写模式打开(参见w)
a+:以读写模式打开(参见a)
rb:以二进制读模式打开
wb:以二进制写模式打开
ab:以二进制追加模式打开(参见a)
rb+:以二进制读写模式打开(参见r+)
wb+:以二进制读写模式打开(参见w+)
ab+: 以二进制读写模式打开(参见a+)
 
2.打开文件。open打开文件 read读文件,close关闭文件
 
import codecs
fd = codecs.open(\'2.txt\')
print fd.read()
fd.close()
 
>>> 11111
2222
33333
aaaaa
bbbbb
cccccc
 
3.查看文件有哪些方法
 
import codecs
fd = codecs.open(\'b.txt\')
print fd.read()
print dir(fd)
fd.close()
 
>>> 11111
2222
333333
[\'close\', \'closed\', \'encoding\', \'errors\', \'fileno\', \'flush\', \'isatty\', \'mode\', \'name\', \'newlines\', \'next\', \'read\', \'readinto\', \'readline\', \'readlines\', \'seek\', \'softspace\', \'tell\', \'truncate\', \'write\', \'writelines\', \'xreadlines\']
 
1>fd.read() 方法,read()方法读取的是整篇文档。
 
fd = codecs.open(\'2.txt\')
text = fd.read()
print type(text)
 
>>><type \'str\'>
 
 
2>replace()函数替换文件中的某个元素。打开文件,读取后,对整个字符串进行操作.把2.txt 文件中的1替换成z
 
fd = codecs.open(\'2.txt\')
a1 = fd.read()
print a1
a2 = a1.replace(\'1\',\'z\')
print a2
 
>>> 11111
2222
33333
aaaaa
bbbbb
cccccc
 
zzzzz
2222
33333
aaaaa
bbbbb
cccccc
 
3> 写文件,codecs.open()函数,避免文件乱码
 
fd = codecs.open(\'3.txt\',\'w\')
fd.write(\'liuzhenchuan\\n\')
fd.write(\'hello world\\n\')
fd.write(\'xiaban\\n\')
fd.close()
 
>>> liuzhenchuan
hello world
xiaban
 
 
4>fd.readlines()方法,读取文件,最后把文件每行内容作为一个字符串放在一个list中
 
fd = open(\'3.txt\')
print fd.readlines()
fd.close()
 
>>> [\'liuzhenchuan\\n\', \'hello world\\n\', \'xiaban\\n\']
 
 
5>fd.readline()方法,读取文件,读取文件一行,类型为字符串
>>> l
 
 
6>#fd.readline()方法,读取文件一行内容,返回一个字符串.          # fd.next()方法,读取文件下一行内容,返回一个字符串
 
fd = codecs.open(\'3.txt\',\'r\')
print fd.readline()
print fd.next()
fd.close()
 
>>> liuzhenchuan
 
    hello world
 
 
7>#write()方法,必须传入一个字符串. 
fd = codecs.open(\'5.txt\',\'w+\')
fd.write(\'a\\nb\\nc\\n\')
fd.close()
 
>>> a
    b
    c
 
 
#writelines()方法,必须传入一个列表/序列
fd = codecs.open(\'6.txt\',\'w\')
fd.writelines([\'123\\n\',\'234\\n\',\'345\\n\'])
fd.close()
 
>>> 123
    234
    345
 
 
8>with用法,不需要用fd.close()关闭文件
with codecs.open(\'3.txt\',\'rb\') as fd:
    print fd.read()
    fd.close()
 
>>> liuzhenchuan
hello world
xiaban
 
 
9>打印文件行号和文件内容
with codecs.open(\'2.txt\') as fd:
    for line,value in enumerate(fd):
        print line,value,
 
>>> 0 liuzhenchuan
    1 hello world
    2 xiaban
 
 
10>过滤文件某行的内容
with codecs.open(\'3.txt\') as fd:
    for line,value in enumerate(fd):
        if line == 3-2:
            print value
 
>>> hello world
 
 
11>导入linecache模块,使用linecache.getline()方法,获取文件固定行的内容
import linecache
count = linecache.getline(\'3.txt\',1)
print count
 
>>> liuzhenchuan
 
 
 

当然,这种方法是普通的写入和读取,我们通常还有这样的问题,那就是字典啊,元祖啊,集合啊等对象,需要写入,但是读取的时候还是要按照原来的形式读取,并非上述方法中的字符串方式读取。那我们就可以使用pickle这个工具了:

首先要导入包

1
import pickle

然后要进行代码的编写,这里要记住,写入文件模式是wb,读取时rb(b一般都是二进制,想必大家应该知道了,它的存储方式):

1
pick_file = open("pick.pick",\'wb\')

如果此时,我们有一个集合:

1
list1 = [1,2,3,4,5,\'abd\',[\'a\',4,\'g\',\'d\']]

则,我么可以这样存储:

1
2
pickle.dump(list1,pick_file)
pickle.close()

如果读取时候,我们可以这样做:

1
2
3
pick_file = open("pick.pick",\'wb\')
list2 = pickle.load(pick_file)
pickle.close()

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

Python 文件操作之读写错误

Python 文件读写操作-Python零基础入门教程

python学习day9笔记

Python文件读写

Python文件读写

Python文件读写操作