Python Day 10 - 文件与文件系统

1 打开文件

  1. open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
    Open file and return a stream. Raise OSError upon failure.
    a. file : 必需,文件路径(相对或者绝对路径)。
    b. mode : 可选,文件打开模式
    c. buffering : 设置缓冲
    d. encoding : 一般使用utf8
    e. errors : 报错级别
    f. newline : 区分换行符
    常见的 mode 如下表所示:
    在这里插入图片描述
    【例】打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出 OSError 。
f = open('将进酒.txt')
print(f)   # <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='UTF-8'>

for each in f:
    print(each)

2 文件对象方法

  1. fileObject.close() 用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError
    错误。
f = open("将进酒.txt")
print('FileName:', f.name) # FileName: 将进酒.txt
f.close()
  1. fileObject.read([size]) 用于从文件读取指定的字符数,如果未给定或为负则读取所有。
f = open('将进酒.txt', 'r')

line = f.read(20)
print("读取的字符串: %s" % line)
# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。

f.close()
  1. fileObject.readline() 读取整行,包括 “\n” 字符。
f = open('将进酒.txt', 'r')

line = f.readline()
print("读取的字符串: %s" % line)

# 读取的字符串: 君不见,黄河之水天上来,奔流到海不复回。
f.close()
  1. fileObject.readlines() 用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。
f = open('将进酒.txt', 'r')

lines = f.readlines()
print(lines)

for each in lines:
    each.strip()
    print(each)
    
f.close()
> ['君不见黄河之水天上来,奔流到海不复回。\n', '君不见高堂明镜悲白发,朝如青丝暮成雪。\n', '人生得意须尽欢,莫使金樽空对月。\n', '天生我材必有用,千金散尽还复来。\n', '烹羊宰牛且为乐,会须一饮三百杯。\n', '岑夫子,丹丘生,将进酒,杯莫停。\n', '与君歌一曲,请君为我倾耳听。\n', '钟鼓馔玉不足贵,但愿长醉不愿醒。\n', '古来圣贤皆寂寞,惟有饮者留其名。\n', '陈王昔时宴平乐,斗酒十千恣欢谑。\n', '主人何为言少钱,径须沽取对君酌。\n', '五花马、千金裘,呼儿将出换美酒,与尔同销万古愁。']
君不见黄河之水天上来,奔流到海不复回。

君不见高堂明镜悲白发,朝如青丝暮成雪。

人生得意须尽欢,莫使金樽空对月。

天生我材必有用,千金散尽还复来。

烹羊宰牛且为乐,会须一饮三百杯。

岑夫子,丹丘生,将进酒,杯莫停。

与君歌一曲,请君为我倾耳听。

钟鼓馔玉不足贵,但愿长醉不愿醒。

古来圣贤皆寂寞,惟有饮者留其名。

陈王昔时宴平乐,斗酒十千恣欢谑。

主人何为言少钱,径须沽取对君酌。

五花马、千金裘,呼儿将出换美酒,与尔同销万古愁。
  1. fileObject.tell() 返回文件的当前位置,即文件指针当前位置。
f = open('将进酒.txt', 'r')

line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。

pos = f.tell()
print(pos) # 58

f.close()
  1. fileObject.seek(offset[, whence]) 用于移动文件读取指针到指定位置。
    a. offset :开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
    b. whence :可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
f = open('将进酒.txt', 'r')

line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。

line = f.readline()
print(line)
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。

f.seek(0, 0)
line = f.readline()
print(line)
# 君不见,黄河之水天上来,奔流到海不复回。

f.close()
  1. fileObject.write(str) 用于向文件中写入指定字符串,返回的是写入的字符长度。
f = open('workfile.txt', 'wb+')
print(f.write(b'0123456789abcdef')) # 16
print(f.seek(5)) # 5
print(f.read(1)) # b'5'
print(f.seek(-3, 2)) # 13
print(f.read(1)) # b'd'

(没有看懂上面的代码)

在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
如果文件打开模式带 b ,那写入文件内容时, str (参数)要用 encode 方法转为 bytes 形式,否则报错: TypeError: a bytes-like object is required, not ‘str’ 。

str = '...'
# 文本 = Unicode字符序列
# 相当于 string 类型
str = b'...'
# 文本 = 八位序列(0到255之间的整数)
# 字节文字总是以‘b’或‘B’作为前缀;它们产生一个字节类型的实例,而不是str类型。
# 相当于 byte[]
f = open('将进酒.txt', 'r+')
str = '\n作者:李白'
f.seek(0, 2)
line = f.write(str)
f.seek(0, 0)
for each in f:
    print(each)
f.close()

# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
# 作者:李白
  1. fileObject.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符 \n
f = open('test.txt', 'w+')
seq = ['小马的程序人生\n', '老马的程序人生']
f.writelines(seq)
f.seek(0, 0)
for each in f:
    print(each)

f.close()
'''
小马的程序人生

老马的程序人生
'''

3 简洁的 with 语句

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法。

try:
    f = open('myfile.txt', 'w')
    for line in f:
        print(line)
except OSError as error:
    print('出错啦!%s' %str(error))
finally:
    f.close()
    
# 出错啦!not readable

这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

try:
    with open('myfile.txt', 'w') as f:
        for line in f:
            print(line)
except OSError as error:
    print('出错啦!%s' % str(error))
    
# 出错啦!not readable

猜你喜欢

转载自blog.csdn.net/weixin_48760912/article/details/114741645
今日推荐