python基础刻意练习--Task 7 文件与文件系统

Day 9-10

文件Files

1、文件的打开
  • open(file, mode='r') 接收两个参数:文件名(file)和模式(mode),用于打开一个文件,并返回文件对象,如果该文件无法被打开,会抛出OSError
  • 其完整的语法形式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 参数说明:
    file: 必需,文件路径(相对或者绝对路径)。
    mode: 可选,文件打开模式
    buffering: 设置缓冲
    encoding: 一般使用utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的file参数类型
    opener:
  • mode的参数有:
    mode参数
    默认为文本模式,如果要以二进制模式打开,加上 b
  • 举个例子:
    safda、
  • 注意!
    我在写的时候会出现这样的错误:
f = open('/Users/dell/Desktop/将进酒.txt')
print(f)
for each in f:
    print(each)
'''
Traceback (most recent call last):
  File "C:/Users/dell/PycharmProjects/untitled1/Python 基础/First files of ZZH.py", line 2, in <module>
    a = f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 52: illegal multibyte sequence
'''

问题在于我们的编码出现了问题,所以很明显从错误中我们可以指导,这是因为文本文档采用的是gbk编码,这个时候我们需要转换成python能识别的编码,比如utf-8,所以我们只要在open()函数里面的文件位置后面加上encoding='utf-8'就可以了。如下例子:

f = open('/Users/dell/Desktop/将进酒.txt',encoding = 'utf-8')
print(f)
for each in f:
    print(each)
# <_io.TextIOWrapper name='/Users/dell/Desktop/将进酒.txt' mode='r' encoding='utf-8'>
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
2、文件对象方法
  • fileObject.close() 用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError错误。
f = open('/Users/dell/Desktop/将进酒.txt',encoding = 'utf-8')
print(f.name)
f.close()
# /Users/dell/Desktop/将进酒.txt
  • fileObject.read([size]) 用于从文件读取指定的字符数,如果未给定或为负则读取所有。
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.read()
print(a)
f.close()
# 会输出整首诗(这里省略)。

f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.read(41)
print(a)
f.close()
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
  • fileObject.readline()读取整行,包括 “\n” 字符。
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.readline()
print(a)
f.close()
# 君不见,黄河之水天上来,奔流到海不复回。
  • fileObject.readlines()用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.readlines()
print(a)
f.close()
# 这样输出的话会变成这个样子:
# ['君不见,黄河之水天上来,奔流到海不复回。\n', '君不见,高堂明镜悲白发,朝如青丝暮成雪。\n', '人生得意须尽欢,莫使金樽空对月。\n', '天生我材必有用,千金散尽还复来。\n', '烹羊宰牛且为乐,会须一饮三百杯。\n', '岑夫子,丹丘生,将进酒,杯莫停。\n', '与君歌一曲,请君为我倾耳听。\n', '钟鼓馔玉不足贵,但愿长醉不复醒。\n', '古来圣贤皆寂寞,惟有饮者留其名。\n', '陈王昔时宴平乐,斗酒十千恣欢谑。\n', '主人何为言少钱,径须沽取对君酌。\n', '五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。']

# 所以我们需要运用for...in...来变得方便阅读
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.readlines()
for i in a:
    i.strip()
    print(i)
f.close()
# 君不见,黄河之水天上来,奔流到海不复回。
# 君不见,高堂明镜悲白发,朝如青丝暮成雪。
# 人生得意须尽欢,莫使金樽空对月。
# 天生我材必有用,千金散尽还复来。
# 烹羊宰牛且为乐,会须一饮三百杯。
# 岑夫子,丹丘生,将进酒,杯莫停。
# 与君歌一曲,请君为我倾耳听。
# 钟鼓馔玉不足贵,但愿长醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,斗酒十千恣欢谑。
# 主人何为言少钱,径须沽取对君酌。
# 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
  • fileObject.tell()返回文件的当前位置,即文件指针当前位置。
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.readline()
b = f.tell()
print(b)   # 62
f.close()
  • fileObject.seek(offset[, whence])用于移动文件读取指针到指定位置。
    offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
    whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
f = open('/Users/dell/Desktop/将进酒.txt',encoding='utf-8')
a = f.readline()
print(a)
a = f.readline()
print(a)
b = f.seek(0,0)
print(b)
a = f.readline()
print(a)
f.close()
'''
君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪。
0
君不见,黄河之水天上来,奔流到海不复回。
'''
  • fileObject.write(str)用于向文件中写入指定字符串,返回的是写入的字符长度。
f = open('/Users/dell/Desktop/study.txt','wb+')
print(f.write(b'93810jxjao103'))   # 13
print(f.seek(5))                   # 5
print(f.read(1))                   # b'j'
print(f.seek(-4,2))                # 9
print(f.read(1))                   # b'o'

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

如果文件打开模式带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('.\\qjj.txt','r+',encoding='utf-8')
str = '\n作者:李白'
f.seek(0,2)
f.write(str)
f.seek(0,0)
for i in f:
    print(i)
f.close()
'''
君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不复醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
作者:李白
'''
  • fileObject.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符\n。
f = open('/Users/dell/Desktop/study.txt','w+',encoding='utf-8')
a = ['好好学习\n','天天向上']
f.writelines(a)
f.seek(0,0)
for i in f:
    print(i)
f.close()
# 好好学习
# 天天向上
3、OS 模块中关于文件/目录常用的函数使用方法

我们所知道常用的操作系统就有:Windows,Mac OS,Linu,Unix等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的系统来考虑使用哪些文件系统模块……,这样的做法是非常不友好且麻烦的,因为这样就意味着当你的程序运行环境一改变,你就要相应的去修改大量的代码来应对。

有了OS(Operation System)模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用。

  • os.getcwd()用于返回当前工作目录。
  • os.chdir(path)用于改变当前工作目录到指定的路径。
import os
path = 'C:\\'
print("当前工作目录 :" ,os.getcwd())
# 当前工作目录 : C:\Users\dell\PycharmProjects\untitled1\Python 基础
os.chdir(path)
print("目录修改成功 :" ,os.getcwd())
# 目录修改成功 : C:\
  • os.listdir(path)返回path指定的文件夹包含的文件或文件夹的名字的列表。
import os
lsd = os.listdir()
for i in lsd:
    print(i)
  • os.mkdir(path)创建单层目录,如果该目录已存在抛出异常。
import os
if os.path.isdir(r'.\b') is False:
    os.mkdir(r'.\B')
    os.mkdir(r'.\B\A')
os.mkdir(r'.\C\A')
# 出现错误
  • os.makedirs(path)用于递归创建多层目录,如果该目录已存在抛出异常。
  • os.remove(path)用于删除指定路径的文件。如果指定的路径是一个目录,将抛出 OSError
import os

print("目录为: %s" % os.listdir(r'.\E\A'))
os.remove(r'.\E\A\test.txt')
print("目录为: %s" % os.listdir(r'.\E\A'))
  • os.rmdir(path)用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError
  • os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常。
import os

print("目录为: %s" % os.listdir(os.getcwd()))
os.removedirs(r'.\E\A')  # 先删除A 然后删除E
print("目录为: %s" % os.listdir(os.getcwd()))
  • os.rename(src, dst)方法用于命名文件或目录,从 srcdst,如果 dst 是一个存在的目录, 将抛出 OSError
import os

print("目录为: %s" % os.listdir(os.getcwd()))
os.rename("test", "test2")
print("重命名成功。")
print("目录为: %s" % os.listdir(os.getcwd()))
  • os.system(command)运行系统的shell命令(将字符串转化成命令)
  • os.curdir指代当前目录(.
  • os.pardir指代上一级目录(..
  • os.sep输出操作系统特定的路径分隔符(win下为\,Linux下为/
  • os.linesep当前平台使用的行终止符(win下为\r\n,Linux下为\n
  • os.name指代当前使用的操作系统(包括:‘mac’,‘nt’)
import os

path = os.getcwd() + '\\a.py'
a = os.system(r'python %s' % path)

os.system('calc')  # 打开计算器

print(os.curdir)  # .
print(os.pardir)  # ..
print(os.sep)  # \
print(os.linesep)
print(os.name)  # nt
  • os.path.basename(path)去掉目录路径,单独返回文件名

  • os.path.dirname(path)去掉文件名,单独返回目录路径

  • os.path.join(path1[, path2[, …]])path1path2 各部分组合成一个路径名

  • os.path.split(path)分割文件名与路径,返回(f_path,f_name)元组。如果完全使用目录,它会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在。

  • os.path.splitext(path)分离文件名与扩展名,返回(f_path,f_name)元组。

  • os.path.getsize(file)返回指定文件大小,单位是字节。

  • os.path.getatime(file)返回指定文件最近的访问时间

  • os.path.getctime(file)返回指定文件的创建时间

  • os.path.getmtime(file)返回指定文件的最新的修改时间

  • 浮点型秒数,可用time模块的gmtime()localtime()函数换算

  • os.path.exists(path)判断指定路径(目录或文件)是否存在

  • os.path.isabs(path)判断指定路径是否为绝对路径

  • os.path.isdir(path)判断指定路径是否存在且是一个目录

  • os.path.isfile(path)判断指定路径是否存在且是一个文件

  • os.path.islink(path)判断指定路径是否存在且是一个符号链接

  • os.path.ismount(path)判断指定路径是否存在且是一个悬挂点

  • os.path.samefile(path1,path2)判断path1path2两个路径是否指向同一个文件

总结:

这次学习文件,感觉有点辛苦,遇到了许多问题,虽然最后还是解决了,但是我还是需要多多巩固,多多复习,抠细节,把这部分学的更好。

学习参考资料:

https://mp.weixin.qq.com/s?__biz=MzIyNDA1NjA1NQ==&mid=2651011475&idx=1&sn=d27e906733ab634a5f173f46c88e3988&chksm=f3e35e0bc494d71d96d18b99b4c7b8478949ed25a5edfed4ef79e598a5354400ca9dad82caaa&mpshare=1&scene=1&srcid=&sharer_sharetime=1572215250838&sharer_shareid=8c49d4226c319addceef298b781f6bb7&key=ed2336ce379cc05e51b90eca66598067e73bfcba75a7ab506c624ca44200c9f530474c462084344a7c85d7cb6945985e51ffe270a92ce372e57eb368a90efb76bd421f730d1cdf4900834982b7e882a4&ascene=1&uin=MTgxNzI3MTY0MQ%3D%3D&devicetype=Windows+10&version=62060841&lang=zh_CN&pass_ticket=HKiGDXEvLe1hZMqQjAxG2EKo2GE24OvZsX6cttHt5dEkjjxJ0mTR9QeNT2z%2BZtts

https://www.liaoxuefeng.com/wiki/1016959663602400/1017624706151424

https://www.runoob.com/python3/python3-tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值