py--文件管理

目录

 

1、文件读写原理和操作步骤

1.1、文件读写原理

1.2、文件的操作步骤

1.3、文件打开模式

1.4、文件操作模式

1.41、r+示例

1.42、w+示例

1.43、a+的示例

1.5、文件读取相关方法

1.51、读取文件的相关方法

1.6、文件的写入操作

1.61、f.write(string)

1.62、fp.writelines()

1.7、文件其他操作

1.8、文件的复制(wb,rb)

1.9、linecache模块


1、文件读写原理和操作步骤

1.1、文件读写原理

文件读写就是一种常见的io操作,python也应该是封装操作系统的底层接口,直接提供了文件读写相关的操作方法,读写文件时需要请求操作系统打开一个对象,(文件描述符:简写为jd)这就是我们在程序中要操作的文件对象

1.2、文件的操作步骤

  1. 打开文件,获取文件描述符
  2. 操作文件描述符,---读/写
  3. 关闭文件

注意事项:

  • 文件读写操作完成后,要及时的关闭文件。

原因:

因为,文件对象会占用系统的资源,另一方面,操作系统对同一时间能打开的文件描述符的数量是有限制的,在linux系统上通过ulimit-n 来查看这个显示的数量。如果不及时的关闭文件,可能会造成句柄占用,数据丢失。因为当将数据写入文件时,操作系统不会立即把数写入到磁盘中,而是先把数据存入到内存缓冲区异步写入磁盘。当调用close方法的时候,操作系统会保证把没有写入磁盘的数据全部写入到磁盘中去,否则丢失数据。

1.3、文件打开模式

1、open方式打开

语法:

open(file,mode="r",encoding=None)
  • file:文件名称,如果代码和所在的文件是同一个目录下,则不用重写书写路径,否则如果不在同一个路径下,需要写上具体的路径。
  • mode:决定了打开文件的模式,默认是read模式
  • encoding:如果不写则默认为gbk模式,也就是对应txt的ansi模式。如果写明utf8,则txt文件中保存也必须是utf8的模式。

示例:

方法1:用open方法打开,需要关闭文件。

#coding=utf-8

fp=open("e://a.txt","r")
str=fp.read()
print(str)

#关闭文件
fp.close()

方法2:用with...open方式打开

with方式打开文件:会默认关闭文件,这种方式比较推荐。

#coding=utf-8

with open ("e:\\a.txt","r",encoding="utf-8") as fp:
    for line in fp:
        print(line)

注意事项:

1、文件的书写模式为:“e:\\a.txt” 或者是r"e:\a.txt"

2、如果读取utf-8的模式下,有utff类的字样,需要安装一个Notepad++,打开文件,将编码格式转换 为:utf-8无Bom格式

问题1:当我不知道该文件的编码是什么编码时,比方用mac本打开,则怎么判断???

>>> fp=open("e:\\a.txt","rb")
>>> content=fp.read()
>>> type(content)
<class 'bytes'>
>>> import chardet
>>> chardet.detect(content)
{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
>>>

问题2:当读取文件时,最终是用什么格式来读取的呢???

>>> fp=open("e:\\a.txt",encoding="utf-8")
>>> content=fp.read()
>>> type(content)
<class 'str'>
>>>

这是因为:bytes类型只用在内存中或者文件存储的时候,当读取文件时,就自动转换为str类型了。

1.4、文件操作模式

  • r: 只读模式,并将文件指针指向文件头, 如果文件不存在,则会报错。
  • w:只写模式,将文件指针指向文件头,如果文件存在则将内容清空,如果文件不存在,则

创建

  • a:只以追加可写的模式打开文件,并将文件指针指向文件的尾端;如果文件不存在则创建
  • r+:在r的基础上增加了可写功能,会覆盖当前文件指针所在的位置的字符。文件的指针放在

文件的开头

  • w+:在w的基础上增加可读功能。在打开文件的时候,就先将文件内容清空 ,如果该文件不

存在,则创建新文件

  • a+:在a的基础上增加了可读功能。只能写在文件末尾,文件打开时,是一个追加模式,如

果该文件不存在,则创建新文件用于读写。

  • b:读写二进制数,需要配合使用,如ab,wb

模式

r

r+

w

w+

a

a+

+

+

 

+

 

+

 

+

+

+

+

+

创建

   

+

+

+

+

覆盖

   

+

+

   

指针在开始

+

+

+

+

   

指针在结尾

       

+

+

练习题:判断r+、a+、w+是有什么区别的。

1.41、r+示例

示例:

情况一:当该目录下没有该文件时,会报错

#coding=utf-8

with open ("e:\\c.txt","r+",encoding="utf-8") as fp:
    for line in fp:
        print(line)

结果:

=========================== RESTART: E:\代码练习\a.py===========================

Traceback (most recent call last):

File "E:\代码练习\a.py", line 4, in <module>

fp=open("e://b.txt","r+",encoding="utf-8")

FileNotFoundError: [Errno 2] No such file or directory: 'e://b.txt'

>>>

情况2:当该目录中有文件时,且该文件有内容,如果直接写入,则写入内容在文件的开头进行覆盖操作。

程序:

#coding=utf-8

fp=open("e:\\b.txt","r+")

fp.write("hellodwejwekwjewe")

fp.seek(0,0)

print(fp.read())

fp.close()

结果:

============================== RESTART: E:\a.py ==============================

hellodwejwekwjeweiqjiwe

3jksjdkfs

>>>

情况3:当该目录下有该文件时,怎样在末尾填写内容,需要先读取文件,将光标放在文件末尾

#coding=utf-8
fp=open("e:\\a.txt","a+",encoding="utf-8")
print(fp.read())
print(fp.tell())
fp.write("hello")
print(fp.read())
fp.close()

注意事项:

1)用r+的时候,每次光标都放在开头,如果要在文章的末尾需要添加内容,需要先读取文件,将光标放在最后的位置才可以。

2)所以如果不移动光标到(0,0)的位置,则无法读取数据。

如果想要读取内容,则需要一个步骤:fp.seek(0,0)

3)r+()方法可以写入内容,会覆盖当前文件指针所在的位置的字符,至于覆盖几个,按照python3的字符来计算。在写入时,通常不建议使用r+()模式。

1.42、w+示例

w+和r+的最大区别,如果文件不存在,则创建一个新文件,不会报错。

#coding=utf-8

fp=open("e:\\xxxx.txt","w+",encoding="utf-8")
fp.write("我是一朵花\n")
fp.write("我是一棵草\n")
fp.flush()
fp.seek(0,0)
content=fp.readlines()

print(content)

fp.close()

注意: 当写入文件后,直接读取,有可能写入内容读取不出来,这是因为写入后,内容没有直接在磁盘上,需要刷新一下,或者是关闭文件重新开启。

1.43、a+的示例

如果文件存在,则光标默认在文件的末尾,a+是追加模式,如果是读取模式,需要先把光标设置成(0,0)的模式,否则读取为空。如果文件不存在,则创建新文件。另外注意,无论光标位于什么位置,使用a+,写入的内容都会放在最后的位置。

程序:

#coding=utf-8

fp=open("e:\\xxxx.txt","a+",encoding="utf-8")

print(fp.readline())
#将游标放在了开始的位置,再进行写
fp.seek(0,0)

fp.write("xxxxxxxxxxxxxxxx")
fp.flush()
fp.seek(0,0)
content=fp.read()
print(content)
fp.close()

结果:

============================== RESTART: E:\a.py ==============================

 

我第四朵花

我是一棵草

我第四我是一朵花

我是一棵草

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

>>>

 

1.5、文件读取相关方法

我们知道,对文件的读取操作,需要将文件中的数据加载到内存中,我们可以查看python中读取文件的相关方法:

1.51、读取文件的相关方法

  • read():一次读取文件的所有内容,返回一个str
  • readline():每次只读取一行内容,包含"\n"字符。
  • readline(size):每次最多读取指定长度的内容,返回一个str,python3中的size指定的是字符长度。
  • readlines():一次性读取所有内容,存放在一个list中。

示例:

在e盘,有一个aa.txt的文件夹

# coding=utf-8

'''aa.txt的保存格式为ansi,也就是默认的gbk类型'''

#方法1:采用read()方式读取文件aa.txt

with open("e:\\aa.txt","r") as fp:
    content=fp.read()
    print(content)


#方法2:采用readline()一行一行的读取

fp=open("e:\\aa.txt","r")
print(fp.readline())
print(fp.readline())
fp.close()


#方法3:采用readlines()将文件一次读取完,放在一个列表中
with open("e:\\aa.txt","r") as fp:
    content=fp.readlines()
    print(content)

#方法4:采用遍历的方式将文件读取出来。
with open("e:\\aa.txt","r") as fp:
    for line in fp:
        print(line)

1.6、文件的写入操作

1.61、f.write(string)

将string写入到文件中,然后返回写入的字符数。

在文件关闭前或者缓冲区刷新前,字符串内容是存储在缓冲区的,这时文件看不到内容。

示例:

# coding=utf-8

'''aa.txt的保存格式为ansi,也就是默认的gbk类型'''

#方法1:采用read()方式读取文件aa.txt

with open("e:\\aa.txt","a+") as fp:
    fp.write("将军行")
    fp.flush()

结果:

注意:在写入时,如果写入的不是字符串,则会报错。

1.62、fp.writelines()

把seq(序列)的内容全部写入到文件中(多行一次性写入),也不会自动加入换行符。

# coding=utf-8

'''aa.txt的保存格式为ansi,也就是默认的gbk类型'''

with open("e:\\aa.txt","a+") as fp:
    num=fp.writelines(["aa\n","bb\n","cc\n"])
    fp.flush()
    fp.seek(0,0)
    print(fp.read())
    

结果:

============================= RESTART: E:\aa.py =============================
静夜思
李白
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。将军行将军行aa
bb
cc

>>> 

问题1:write函数会清空原来文件中的内容,那么怎么才能够不清除原有内容,再增加新的内容呢?

答案:

1)可以使用“a+”的方式,该种方式在文件末尾增加元素

2)先读一个文件,将光标移动到最后的位置上,然后再写入。

注意事项:

序列中的内容也必须是字符串类型的数据,才能够正常写入文件。

练习题:写入一个文件,文件的内容为:glory1----glory100

# coding=utf-8

'''aa.txt的保存格式为ansi,也就是默认的gbk类型'''

with open("e:\\cc.txt","w+") as fp:
    for i in range(1,101):
        fp.write("glory"+str(i)+"\n")
    fp.flush()
    fp.seek(0,0)
    for line in fp:
        print(line)
    

结果:

1.7、文件其他操作

  • flush():将缓冲区的内容写入到硬盘中。其实可以不关闭文件,进行一下刷新机制也是可以的。
  • seek(offset,whence):用于移动文件读取指针的位置,

                          offset:开始偏移量,也就是代表需要移动偏移的字节数。

                           whence:可选,默认为0,0:从文件开头开始计算。1:从当前位置开始计算。2:从文件末尾开始计算。

  • tell():获取当前文件指针所在的位置。
  • close():关闭文件
  • truncate([size]):把文件裁定到固定的大小。

1.8、文件的复制(wb,rb)

示例1:复制一个excel表格。

# coding=utf-8

'''复制一个docx文件'''

with open("e:\\python3编程基础笔记.docx","rb") as fp:
    content=fp.read()


fp2=open("e:\\aaaa.docx","wb")
fp2.write(content)
fp2.flush()
fp.close()
    

结果:

1.9、linecache模块

注意:

linecache是用utf-8的格式处理文件,所以打开的文件需要utf-8的文件。

  • linecache.getlines(filename):从文件中读取全部内容,输出为列表格式,以文件每行为列表的一个元素,并且以linenum-1为元素在列表中的存储位置。
  • linecache.checkcache(filename):检查缓存的有效性。如果在缓存中的文件在硬盘中发生了变化,并且需要你更新版本,使用这个函数,执行此函数会将淘汰的内容删除。
  • linecache.updatecache():更新文件名为filename的缓存。如果filename文件更新了,使用这个函数可以更新linecache.getlines(filename)返回的列表。如果出错,则返回空列表。
  • linecache.clearcache():清理缓存。

示例:

>>> import linecache
>>> fp=linecache.getlines("e:\\aa.txt")
>>> print(fp)
['君不见\n', '黄河之水\n', '天上开\n', '及低温\n', 'sdjiwe\n']
>>> fp=linecache.getlines("e:\\aa.txt")[2:]
>>> print(fp)
['天上开\n', '及低温\n', 'sdjiwe\n']
>>> fp=linecache.updatecache("e:\\aa.txt")
>>> fp=linecache.getline("e:\\aa.txt",2)
>>> print(fp)
黄河之水

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章