文章目录
能调用方法的只有对象,文件本身也是一个对象
文件的操作
文件的操作过程:
- 打开文件,拿到文件的操作句柄或叫文件描述符(File Descriptor)
- 通过句柄对文件进行操作
- 关闭文件
- 养成良好的习惯,文件用完之后要使用“close()”关闭文件,也可以使用“with” 来打开文件,用完之后会自动关闭相应的文件
open()建立一个文件对象
- 用于打开一个文件,并赋以相应的权限,打开的内容可以使用一个变量进行接收
语法
open ( file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None )
butlin关于open()方法的英文解释
open() 方法支持参数
file :文件的路径 可以是绝对路径,也可以是相对路径
+ 绝对路径:从文件系统的根开始
+ 相对路径:相对于程序文件目录
mode :操作文件的模式,可选参数,默认为“r”
+ r: read--读文件操作,如果只有“r”参数,在文本模式中,文件是只读不可写的
+ w: write--写文件操作,如果是只有“w”参数,文件是只写不可读的,单独使用此参数请注意,一旦创建这个文件对象,且有写操作,则直接清空文件内容,如果没有这个文件,则创建这个文件。原文为“open for writing, truncating the file first”,一旦开始,首先就截短文件为空白。
+ x: exclusive 如果不存在这个文件就创建,如果文件已经存在则打开打败。可用于创建文件前先判断此文件是否已经存在
+ a: append--往后面追加,也不能读,与“w”一样,都是写,不同之处在于,无论当前的seek位置(指针位置,或者叫光标的位置)在哪里,a是往文件最后追加,默认情况下往最后直接写,建议在写之前先加一个“\n”换行符。
+ b: 二进制模式
+ t: 文本模式(默认模式)
+ +: 打开文件用于更新(读和写)
- r+: 读写模式,从指针所在的位置往后写,往哪儿写要看指针所在位置,指针所在位置可以使用tell()方法查询
- w+: 写读模式,写完一个数据后,指针就移到写的末尾,如果此时再读,要看后面有没有内容。或者使用seek() 调整光标的位置
- a+: 追加读模式,与写一样,需要看打针所在的位置,因为a默认是从文件尾部追加,所以读就从此后读,所以不调整光标默认读到的是空白
buffering =
+ 是一个可选的数字参数,用于设置缓存策略
- 0 : 关闭缓存(仅允许在二进制模式中)
- 1 :行缓存(仅在文本模式中可用)
- >1 :用于指明缓存的字节大小
+ 当没有二进程文件缓存至指定大小的框中,默认策略如下:
- 二进制文件 固定缓存大小
- 缓存的大小使用一种探索式的尝试从度层设备的“块大小”反馈来设置默认的缓存大小(DEFAULT_BUFFER_SIZE)
- 在许多系统中,缓存的典型大小是4字节或者8字节。
encoding
+ 用于标明文件内字符编码
+ 在文本模式下,如果“encoding”没有手动指定,将使用操作系统平台默认的locale,python3 会通过“locale.getpreferredencoding(False)”函数来获取当前平台的默认编码。
+ 二进制模式下,读写都使用裸字节,就是原始的0101直接发过去,所以保留了原始的编码。
errors
+ 是一个可选项
+ 用于指定怎么对“encoding”,"decoding"所遇到的错误
+ 不能用于二进制模式
+ 各种各样的标准错误处理方法都可以使用“error()”函数进行处理,标准和名称包含如下:
- ignore : 忽略,**注意**:忽略编码错误会导致数据丢失
- strict :严格,编码错误时,提高异常错误的值,默认的值为None与strict有同样的功能
- replace :替换,编码错误时,生成一个替换的标记(如“?”),然后插入到原文中,会看起来很难看。
- surrogateescape :
+ 不知道咋翻译:从单词上看“代理逃逸”:如遇到编码错误,将使用“Unicode”的私有编码,范围从“U+DC80” 到“ U+DCFF”的来替换错误字节到原位置
+ 对于处理一些不知道编码的文件会很有用。
- xmlcharrefreplace:
+ 仅用于写文件时,编码不支持的字符,将会使用一个合适的XML特性,如&#nnn;
- backslashreplace :
+ 使用Python的 逃逸符“\”来代替原先畸形的数据
- namereplace:
+ 仅用于写文件,
+ 使用“\N”来替换不支持的字符
newline :指定换行符
- 仅用于“文本模式”
- 用于控制如何换行,就是说明一下文件的换行符:
- 换行符可以是:
- None
- "
- ‘\n’
- ‘\r’
- ‘\r\n’
- 如果从一个数据流中输入数据:
- 换行符是None,使用的是通用的换行模式,一行的结束可以是‘\n’,’\r’或者是’\r\n’,在将数据返回给请求者之前,这些换行符将都被统一转换成’\n’
- 如果是“(一个双引号做为换行符),通用的模式被开启,但是返回给请求都之前,不会被转换
- 如果是其它的合法的值,输出的行将仅用给定的换行符进行换行,并且换行符在返回给请求者之前不会被翻译
- 如果是写入输出一个数据流:
- None: 任何’\n’ 换行符被转换成系统默认的换行符,可使用“os.linesep” 替换
- “ 或者是‘\n’ :不会转换
- 其它:所有的’\n’字符将被转换成给定的换行符。
closefd 指定关闭文件描述符
- 如果closefd 是False 并且 ”文件描述符(file descriptor)不是文件名给定的,文件关闭后底层系统的描述符将被保持打开,文件名称指定的closefd 为Ture(默认就是Ture) 否则会报出一个错误。
opener
文件对象的各类操作方法
-
read()
-
括号内有参数,什么都不加表示全读出来
-
数字做为参数:按字位置,一次取一个字符,一个汉字也表示 一个字符
-
closed()
- 文件使用完后关闭文件的函数
-
write()
- 执行具体的写文件操作,可接收参数
- 直接将写入文件的内容当做参数:这种是“覆盖写”操作
- 如果有多个“write”方法操作,不会下一个覆盖上一个的覆盖写,默认不换行的“追加写”,如果需要换行则写入一个“换行符\n”
-
readline()
- 按行读取内容,不像read() 方法一样按字符取。
- 只到换行符就知道此行结束了
- 出现多次则连接的往后读,并不是重复的读同一行,其实内部操作的“指针”定位
- 不带任何表示一次读一行
- 可输入数字,表示一次性读取多少字符,带数字后与read比较像
- 注意
- 读一次后会将光标或者叫指针移动到读到的位置。
- readline() 可以出现多次,第二次读就从第一次读完成后的光标所在处开始读(如下示例中有描述)
- 带参数后并不是严格的一次输出一整行
-
readlines()
-
tell()
- 检测当前光标的位置
- 调用此方法可以显示此指针所在的位置
- 位置的数量是字符占用的字符位个数
- Python3-UTF-8中一个中文占用3个字符
-
seek()
- 接收的参数为数字,代表设置的指针的位置
- 调整指针所在的位置
-
flush()
- 调用后,马上将内存缓冲区的数据同步到磁盘上永久存储
- 写进度条常用
-
truncate()
- 截短
- 括号内可跟数字参数,默认为-1
- 需要对文件有写的权限,如果为-1或者为空,默认从最开始的位置截到最后
- 指定的数字为参数,截取多个个字符
- 如果打开文件的时候是“w"权限,,如果文本本身有内容,则打开的时候文件就清空了,再截取就是空白字符,
- 如果是程序中操作写入字符后,再截短的,可正常截断。
- 如果打开文件的时候是“a"权限,不会清空文档。
-
fileno()
- 文件描述符
-
isatty()
- 判断打开的文件是否是一个终端设备
- 返回值为布尔值
-
readable()
- 判断打开的文件是否可读
-
writeable()
- 判断打开的文件是否可写
各类方法示例:
- 支持参数
- int :可接受一个数字,用于指定只显示多少个字符
- 需要注意的是,在read的时候,英文中文都只占一个位置
- int :可接受一个数字,用于指定只显示多少个字符
read()
widowns下file使用相对路径
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.read())
以下为输出内容
"""
《少年游.本意》金庸
青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。
谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。
"""
file.close()
file:直接填写了文件名,所以这里使用的是相对路径,与程序的目录在一起
windows下file使用绝对路径
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.read())
file.close()
输出内容与上面一样,此处不张贴
指定读取字符个数
import sys #导入一个sys模块
print(sys.getdefaultencoding()) #打印当前python的默认编码
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.read(8)) #打印前8个位置的字符
"""
utf-8
《少年游.本意》
"""
file.close()
readline()
不带参数
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readline())
file.close()
###############以下为输出内容###############
"""
《少年游.本意》金庸
"""
带数字参数
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readline(5)) #打印前5个位置的字符
file.close()
###############以下为输出内容###############
"""
《少年游.
"""
多次readline() 并观察光标(指针)的计数
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print("还没开始读时:",file.tell())
print(file.readline(5))
print("第一次读:",file.tell())
print(file.readline(5))
print("第二次读:",file.tell())
print(file.readline(5))
print("第三次读:",file.tell())
print(file.readline(5))
print("第四次读:",file.tell())
print(file.readline(5))
print("第五次读:",file.tell())
file.close()
###############以下为输出内容###############
"""
还没开始读时: 0
《少年游.
第一次读: 15
本意》金庸
第二次读: 30
第三次读: 32
青衫磊落险
第四次读: 47
峰行。玉壁
第五次读: 62
"""
readlines()
不带参数
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readlines())
file.close()
###############以下为输出内容###############
"""
['《少年游.本意》金庸\n', '青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。\n', '谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。']
"""
带1个数字参数(数字为1小于一行的字符数)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readlines(1))
print(file.readlines(1))
print(file.readlines(1))
file.close()
###############以下为输出内容###############
"""
['《少年游.本意》金庸\n']
['青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。\n']
['谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。']
带1个参数(每数字都小于每行的字符个数)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print("还没开始读时:",file.tell())
print(file.readlines(5))
print(file.readlines(5))
print(file.readlines(5))
print(file.readlines(5))
file.close()
###############以下为输出内容###############
"""
还没开始读时: 0
['《少年游.本意》金庸\n']
['青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。\n']
['谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。']
[]
"""
带1个参数(大于一行的字符个数)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print("还没开始读时:",file.tell())
print(file.readlines(11))
print(file.readlines(5))
print(file.readlines(5))
print(file.readlines(5))
file.close()
###############以下为输出内容###############
"""
还没开始读时: 0
['《少年游.本意》金庸\n', '青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。\n']
['谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。']
[]
[]
"""
mode=“w”:–探索w模式默认的一上来就truncate()操作
#################w之前先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之前读取文件内容:\n",file.read())
file.close() #查看之后一定要记得关闭这个打开操作
#################open()操作执行w模式######################
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.close()
#################w之后先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之后读取文件内容:\n",file.read())
file.close()
###############以下为输出内容###############
"""
w模式之前读取文件内容:
《少年游.本意》金庸
青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。
谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。
w模式之后读取文件内容:
"""
write()–往文件内写内容
- 写之前先读一下文件内的内容
- 开始写操作,并且执行3次write,最后加上换行符\n
- 写之后再读一次文件的内容
#################w之前先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之前读取文件内容:\n",file.read())
file.close() #查看之后一定要记得关闭这个打开操作
#################open()操作执行w模式######################
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.write(" 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。\n ")
file.write(" 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。\n ")
file.write(" 将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 \n")
file.close()
#################w之后先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之后读取文件内容:\n",file.read())
file.close()
###############以下为输出内容###############
"""
w模式之前读取文件内容:
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。 将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
w模式之后读取文件内容:
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
"""
write()–探索write()的覆盖写操作
- 写之前先读一下文件内的内容
- 写第一次文件,写完后关闭文件
- 写第二次文件,写完后关闭文件
- 写之后再读一次文件的内容
第一次使用wirite()写一行,然后再写一行,最后查看数据只有最后一次写的一行。此功能可用于临时的文件,数据不用保存,但是需要临时写一下文件。
#################w之前先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之前读取文件内容:\n",file.read())
file.close() #查看之后一定要记得关闭这个打开操作
#################open()操作执行w模式######################
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.write(" 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。\n ")
file.close()
#################open()操作执行w模式######################
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.write(" 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。\n ")
file.close()
#################w之后先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("w模式之后读取文件内容:\n",file.read())
file.close()
###############以下为输出内容###############
"""
w模式之前读取文件内容:
《少年游.本意》金庸
青衫磊落险峰行。玉壁月华明。马疾香幽。崖高人远。微步縠纹生。
谁家子弟谁家院。无计悔多情。虎啸龙吟。换巢鸾凤。剑气碧烟横。
w模式之后读取文件内容:
宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
"""
seek() 设置指针(光标)的位置
- 打开一个文件使用read读两行
- seek光标到0
- 读第三次
- seek光标到0
- 读第四次
- 查看结果
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print("第一次读12个位置:",file.read(12))
print("第二次读15个位置:",file.read(15))
file.seek(0)
print("第三次读12个位置:",file.read(12))
file.seek(0)
print("第四次读15个位置:",file.read(15))
file.close() #查看之后一定要记得关闭这个打开操作
"""
第一次读12个位置: 臣本布衣,躬耕于南阳,
第二次读15个位置: 苟全性命于乱世,不求闻达于诸侯
第三次读12个位置: 臣本布衣,躬耕于南阳,
第四次读15个位置: 臣本布衣,躬耕于南阳,苟全性
"""
tell() 获取当前指针(光标)的位置
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它参数默认
print("还没开始读时:",file.tell())
print(file.readline(5))
print("第一次读:",file.tell())
print(file.readline(5))
print("第二次读:",file.tell())
print(file.readline(5))
print("第三次读:",file.tell())
print(file.readline(5))
print("第四次读:",file.tell())
print(file.readline(5))
print("第五次读:",file.tell())
file.close()
###############以下为输出内容###############
"""
还没开始读时: 0
《少年游.
第一次读: 15
本意》金庸
第二次读: 30
第三次读: 32
青衫磊落险
第四次读: 47
峰行。玉壁
第五次读: 62
"""
flush() 将缓存中内容写到磁盘,刷写磁盘–打印一个进度条显示
方法一:使用sys模块的stdout()
import sys,time
for i in range(50):
sys.stdout.write("*")
sys.stdout.flush()
time.sleep(1)
"""
**************************************************
结果是一个动态的效果
"""
方法二:使用print()方法
for i in range(50):
print("*",flush=True,end="")
time.sleep(1)
truncate() 截短
truncate 示例:探索truncate只截取指针(光标)之后的内容
示例一:未使用seek定位光标内容
- w模式写入文件
- truncate
- print查看内容
- 结果为写入的两行
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.write("臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 \n")
file.truncate()
file.write("臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 \n")
#file.seek(0)
file.truncate()
file.close()
#################w之前先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8")
print("truncate后:\n",file.read())
file.close()
"""
truncate后:
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
"""
示例二:使用seek定位光标内容
- w模式写入文件
- seek光标位置为0后
- truncate
- print查看内容
- 结果为空
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
file.write("臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 \n")
file.truncate()
file.write("臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 \n")
file.seek(0)
file.truncate()
file.close()
#################w之前先读取文件的内容并输出查看一遍######################
file = open("少年游本意",mode="r",encoding="utf8")
print("truncate后:\n",file.read())
file.close()
"""
truncate后:
"""
fileno() 查看当前文件的“文件描述符”
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
print(file.fileno())
file.close()
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.fileno())
file.close()
"""
3
3
"""
readable()-判断文件是否可读
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
print(file.readable())
print(file.writable())
file.close()
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readable())
print(file.writable())
file.close()
"""
False
True
True
False
"""
writeable()-判断文件是否可写
file = open("少年游本意",mode="w",encoding="utf8") #其它参数默认
print(file.readable())
print(file.writable())
file.close()
file = open("少年游本意",mode="r",encoding="utf8") #其它参数默认
print(file.readable())
print(file.writable())
file.close()
"""
False
True
True
False
"""
遍历文件内容
直接for循环每一行内容
- 每行下面有一个换行符,是因为print本身有一个换行,而文本内容内也有一个换行符,所以换了两次行
file = open("少年游本意",mode="r",encoding="utf8")
#print(file.read())
for i in file.readlines():
print(i)
"""
《少年游.本意》金庸
青衫磊落险峰行。
玉壁月华明。
马疾香幽。
崖高人远。
微步縠纹生。
谁家子弟谁家院。
无计悔多情。
虎啸龙吟。
换巢鸾凤。
剑气碧烟横。
"""
直接for循环readlines()每一行内容(去掉print的换行符)
- 使用end="" 将print的换行符取消
file = open("少年游本意",mode="r",encoding="utf8")
#print(file.read())
for i in file.readlines():
print(i,end="")
"""
《少年游.本意》金庸
青衫磊落险峰行。
玉壁月华明。
马疾香幽。
崖高人远。
微步縠纹生。
谁家子弟谁家院。
无计悔多情。
虎啸龙吟。
换巢鸾凤。
剑气碧烟横。
"""
直接for 循环file的每一行
直接循环file的每一行,此种方法并不像readlines()方法一样,全部加入到内存,而是读到该行的时候,将该行加入到内存,读完之后从后从内存清空,对于特别大的文件必需使用此方法,否则内存不够。for循环内部将file对象生成迭代器,不停的迭代新内容。对于文本来说,用一行取一行。使用完后内存释放。建议使用这种机制
file = open("少年游本意",mode="r",encoding="utf8")
for i in file:
print(i,end="") # end="" 去掉print的换行符
"""
《少年游.本意》金庸
青衫磊落险峰行。
玉壁月华明。
马疾香幽。
崖高人远。
微步縠纹生。
谁家子弟谁家院。
无计悔多情。
虎啸龙吟。
换巢鸾凤。
剑气碧烟横。
"""
遍历并修改指定行内容
.strip() 可以去掉换行符
file = open("少年游本意",mode="r",encoding="utf8")
lineNumber = 0
for i in file:
lineNumber+=1
if lineNumber == 6:
i = " ".join([i.strip(),"This is test Line.\n"])
print(i,end="")
"""
少年游.本意》金庸
青衫磊落险峰行。
玉壁月华明。
马疾香幽。
崖高人远。
微步縠纹生。 This is test Line.
谁家子弟谁家院。
无计悔多情。
虎啸龙吟。
换巢鸾凤。
剑气碧烟横。
"""
不加.strip()
file = open("少年游本意",mode="r",encoding="utf8")
lineNumber = 0
for i in file:
lineNumber+=1
if lineNumber == 6:
i = " ".join([i,"This is test Line.\n"])
print(i,end="")
"""
《少年游.本意》金庸
青衫磊落险峰行。
玉壁月华明。
马疾香幽。
崖高人远。
微步縠纹生。
This is test Line.
谁家子弟谁家院。
无计悔多情。
虎啸龙吟。
换巢鸾凤。
剑气碧烟横。
"""
将文件转成“枚举”后打印行号
file = open("少年游本意",mode="r",encoding="utf8")
for i,v in enumerate(file.readlines()):
print(i,v,end="")
"""
0 《少年游.本意》金庸
1 青衫磊落险峰行。
2 玉壁月华明。
3 马疾香幽。
4 崖高人远。
5 微步縠纹生。
6 谁家子弟谁家院。
7 无计悔多情。
8 虎啸龙吟。
9 换巢鸾凤。
10 剑气碧烟横。
"""
with 语句
为了避免打开文件后忘记关闭,可以通过with 管理上下下文
with 语句是**"上下文管理器“**定义的一个方法,用于打包一些需要执行的语句。这允许通用的” try…except…finally“ 一样封装一些便于重复使用的语句。
with_stmt ::= "with" with_item ("," with_item)* ":" suite
with_item ::= expression ["as" target]
主要的使用方法如下:
with open("少年游本意",mode="r",encoding="utf8") as file:
print(file.read())
如上,当file文件使用完成后,会自动关闭该文件,释放资源。
多个文件同时管理:
with open("少年游本意",mode="r",encoding="utf8") as file , open("c:\少年游本意",mode="w",encoding="utf8") as file2:
print(file.read())
print(file2.read())