Python Basic - Python open() 、closed()、write()、read()、 readline()、readlines()、with与文件进行交互

文章目录


能调用方法的只有对象,文件本身也是一个对象

文件的操作

文件的操作过程:

  1. 打开文件,拿到文件的操作句柄或叫文件描述符(File Descriptor)
  2. 通过句柄对文件进行操作
  3. 关闭文件
    • 养成良好的习惯,文件用完之后要使用“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()

    • 多行读
    • 不带参数一次输出所有行
    • 默认输出为**列表**类型,原文本的一行为一个元素,一个元素一个下标。且输出结尾包含换行符
    • 一次性全部读取到内存中,大文件不建议此操作。
    • 数字做为参数表示:
      • 还是按字符个数计算,表示一次读取多少个字符,但是因为readlines()是列表输出,所以一次必需输出一行
      • 只要输入的数字小于1行的字符个数,则整行都输出到列表
      • 如果输入的数字大于1行的字符的个数且小于两行的字符个数,则输出两行到一个列表
      • 具体可见下述示例
  • tell()

    • 检测当前光标的位置
    • 调用此方法可以显示此指针所在的位置
    • 位置的数量是字符占用的字符位个数
    • Python3-UTF-8中一个中文占用3个字符
  • seek()

    • 接收的参数为数字,代表设置的指针的位置
    • 调整指针所在的位置
  • flush()

    • 调用后,马上将内存缓冲区的数据同步到磁盘上永久存储
    • 写进度条常用
  • truncate()

    • 截短
    • 括号内可跟数字参数,默认为-1
    • 需要对文件有写的权限,如果为-1或者为空,默认从最开始的位置截到最后
    • 指定的数字为参数,截取多个个字符
    • 如果打开文件的时候是“w"权限,,如果文本本身有内容,则打开的时候文件就清空了,再截取就是空白字符,
    • 如果是程序中操作写入字符后,再截短的,可正常截断。
    • 如果打开文件的时候是“a"权限,不会清空文档。
  • fileno()

    • 文件描述符
  • isatty()

    • 判断打开的文件是否是一个终端设备
    • 返回值为布尔值
  • readable()

    • 判断打开的文件是否可读
  • writeable()

    • 判断打开的文件是否可写

各类方法示例:

  • 支持参数
    • int :可接受一个数字,用于指定只显示多少个字符
      • 需要注意的是,在read的时候,英文中文都只占一个位置

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()–往文件内写内容

  1. 写之前先读一下文件内的内容
  2. 开始写操作,并且执行3次write,最后加上换行符\n
  3. 写之后再读一次文件的内容
#################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()的覆盖写操作

  1. 写之前先读一下文件内的内容
  2. 写第一次文件,写完后关闭文件
  3. 写第二次文件,写完后关闭文件
  4. 写之后再读一次文件的内容
    第一次使用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() 设置指针(光标)的位置

  1. 打开一个文件使用read读两行
  2. seek光标到0
  3. 读第三次
  4. seek光标到0
  5. 读第四次
  6. 查看结果
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定位光标内容

  1. w模式写入文件
  2. truncate
  3. print查看内容
  4. 结果为写入的两行
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定位光标内容

  1. w模式写入文件
  2. seek光标位置为0后
  3. truncate
  4. print查看内容
  5. 结果为空
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循环每一行内容

  1. 每行下面有一个换行符,是因为print本身有一个换行,而文本内容内也有一个换行符,所以换了两次行
file = open("少年游本意",mode="r",encoding="utf8")
#print(file.read())
for i in file.readlines():
    print(i)

"""
《少年游.本意》金庸

青衫磊落险峰行。

玉壁月华明。

马疾香幽。

崖高人远。

微步縠纹生。

谁家子弟谁家院。

无计悔多情。

虎啸龙吟。

换巢鸾凤。

剑气碧烟横。

"""

直接for循环readlines()每一行内容(去掉print的换行符)

  1. 使用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())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值