如何最简单、通俗地理解Python的文件?
原文链接:https://www.zhihu.com/question/431437471/answer/1588566615
一、笔记
1) Python文件
① Python文件后缀一般以 .py 结尾。
② Python中,使用open函数,如果文件存在,则打开一个已经存在的文件,如果文件不存在,则新建一个文件。
③ open函数用法:open(name[,mode[,buffering[,encoding]]])
1. name:一个包含了你要访问的文件名称的字符串(区分绝对路径和相对路径)。
2. mode:mode决定了打开文件的模式:只读,写入,追加等。这个参数是非强制的,默认模式为只读(r)。
3. buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取为1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是寄存区的缓冲大小、如果取负值,寄存区的缓冲大小则为系统默认。
4. encoding:为编码格式,我们一般使用uft-8
④ 对文件的操作结束之后,使用close()来关闭文件,如果不关闭文件,就会一直占着内存。
# coding=utf-8
# 写文件 # 用写模式时,若有原文件,则内容会被清空,即写内容覆盖原内容
file = open('a.txt','w',encoding='utf-8') # 当前文件的同级路径下,新建(因为没有原文件)了一个 a.txt文件
file.write('aaa') # a.txt 文件中写入了 aaa
file.close()
# 文件追加内容
file = open('a.txt','a',encoding='utf-8')
file.write('bbb') # a.txt 文件中 aaa 末尾(不换行)追加了 bbb,变为 aaabbb
file.close()
# 以只读方式打开文件
file = open('a.txt','r',encoding='utf-8')
print(file.read()) # 读出文件中的数据
# print(file.write('小王')) # 只读模式下,写的话会报错
file.close()
运行结果:
aaabbb
# r+:读追加模式,先读,再追加
file = open('a.txt','r+',encoding='utf-8')
print(file.read())
file.write('小王') # 追加是在末尾追加,没有换行
print(file.read()) # 第二行没有打印出来,为空白行,r+模式,追加后不能再读
file.close()
运行结果:
aaabbb小王
'空白行'
# w+:写读模式,先写,意味着原本内容丢失,只写不能读。
# w+:创建新文件,打开并写入数据,如果文件已存在,则覆盖写
file = open('a.txt','w+',encoding='utf-8')
file.write('小王') # 原文件内容被覆盖,文件中内容仅有'小王'
print(file.read()) # 空白行,因为不能读
file.close()
运行结果:
'空白行'
# 读取上面w+写入的数据
file = open('a.txt','r',encoding='utf-8')
print(file.read())
file.close()
运行结果:
小王
2) 文件读写
① read(num):可以读取文件里面的内容。num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
② readlines():可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。如果想在with代码块外访问文件,就用readlines()从文件中读取每一行,将其存储在一个列表中。
③ 读取文本文件时,Python将其中的所有文本都解读成字符串。如果你读取的是数字,并要将其作为数值使用,就必须要使用函数int()将其转换成整数,或使用函数float()将其转换为浮点数。
④ 如果你要写入的文件不存在,函数open()将会自动创建它。我们使用文件对象的方法write()将一个字符串写入文件,这个程序是没有终端输出函数write()不会在你写入的文本末尾添加换行符,需要手动添加\n。
⑤ Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换成字符串格式。
⑥ flush()函数只与write()写文件有关,与读文件无关,flush()方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用flush()方法。
⑦ tell()函数返回文件游标的当前位置,以文件的开头为原点,当用追加'a'时,游标位置在文件末尾。
⑧ seek(offser[,whence]])函数:offset:一开始的偏移量,也就是代表需要偏移的字节数。whence:可选,默认值为0.给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从末尾算起。可以通过偏移在文件的任意位置写入数据。
⑨ 用with open 创建的文件,编码格式为函数中的utf-8,但如果是自己在文件夹中创建的文件,编码格式不一定是utf-8,所以用两种方式读取的文件,可能文件常用函数运行的情况不一样。
with open('a.txt','r',encoding='utf-8') as f: # 等同于 f = open('a.txt','r',encoding='utf-8')
print(f.readlines())
运行结果:
['小王']
with open('a.txt','a',encoding='utf-8') as f:
f.write('\naaa') # 换行写入数据的用法,在写入数据前添加换行符,打印时换行符跟着上一行数据在列表中。
with open('a.txt','r',encoding='utf-8') as f:
print(f.readlines())
运行结果:
['小王\n', 'aaa']
file = open('a.txt','a',encoding='utf-8')
file.write('\n999') # write() # 此语句运行完后,还没写入硬盘,也就是还没写进去
file.flush() # flush()运行完后,写入硬盘(即a.txt文件)了,平常flush()只有当close()关闭文件后,才写入硬盘。
file.close()
#coding=utf-8
with open('a.txt','r',encoding='utf-8') as f:
print(f.readlines())
print(f.tell())
f.seek(5,0)
print(f.read(2))
print(f.tell())
3) with open语句
① 关键字with在不再需要访问文件后将其关闭,这可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
② 可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close语句未执行,文件将不会关闭。
运行结果:
with open('a.txt','r',encoding='utf-8') as f: # 等同于 f = open('a.txt','r',encoding='utf-8')
print(f.read())
运行结果:
小王
aaa
999
4) 文件夹操作
① python编程时,经常和文件、目录打交道,这就离不开os模块。os模块包含普遍的操作系统功能,与具体的平台无关,linux系统、windows系统都有。
② os.getcwd()获得当前工作的目录。
③ os.listdir()指定所有目录下所有的文件和目录名。以列表的形式全部列举出来,其中没有区分目录(文件夹)和文件(py文件)。
④ os.remove()删除指定文件。
⑤ os.rmdir()删除指定目录。删除目录时,必须该目录下没有文件或文件夹,即空目录才可删除,非空目录不可删除,会报错。
import os
with open('a.txt','r',encoding='utf-8') as f: # 当前文件的当前目录下有个 a.txt 文件
print(f.read()) # 读取当前文件的当前目录下的 a.txt 文件中内容
print(os.getcwd()) # 获得当前文件的当前目录
print(os.listdir('C')) # 查看当前文件的同级目录下的C文件夹下有哪些目录和文件
print(os.listdir(os.getcwd())) # 查看当前文件的当前目录下有哪些目录和文件
运行结果:
小王
aaa
999
C:\Users\宝贝入怀\Desktop\10.11\00_git\02 Python难点
['CV.txt', '新建文件夹']
['.ipynb_checkpoints', 'a.txt', 'C', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
import os
import os
file = open('a.txt','w',encoding='utf-8') # 当前文件的同级路径下,新建(因为没有原文件)了一个 a.txt文件
file.write('aaa') # a.txt 文件中写入了 aaa
file.close() # 如果不写 file.close() 无法后续进行 os.remove('a.txt') 操作,会报错,显示 a.txt 在另一个程序中运行。
print(os.listdir(os.getcwd())) # 查看当前文件的当前目录下有哪些目录和文件
os.remove('a.txt') # 删除当前目录下的'a.txt'文件
print(os.listdir(os.getcwd())) # 'a.txt'文件 已经被删除
os.rmdir('D') # 删除D文件夹,这里只能删除空文件夹,如果文件夹里有东西,例如C文件夹,就不可以删除
print(os.listdir(os.getcwd())) # D文件夹 已经被删除
运行结果:
['.ipynb_checkpoints', 'a.txt', 'C', 'D', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
['.ipynb_checkpoints', 'C', 'D', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
['.ipynb_checkpoints', 'C', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
# os.rmdir(r'modpython\d') 删除指定目录
# os.mkdir(r'modpython\d') 创建目录,注意:这样只能建立一层,要想递归建立可用:os.makedirs()
# os.makedirs(r'modpython\d\c\v') 可以创建很多层文件夹,用的是递归创建的方法
# os.path.isfile(r'modpython\d\c\v') 判断路径是否是一个文件,这是一个文件夹,所以不是文件
# os.path.isdir(r'modpython\d\c\v\a.txt') 判断路径是否为目录
# os.path.exists() 判断文件或文件夹是否存在
# os.path.spilt() 返回路径的目录和文件名
# os.system() 执行shell命令,例如 os.system('cmd') 启动dos
# os.chdir() 改变目录到指定目录
# os.path.getsize 获取文件的大小,如果为目录,返回0
# os.path.abspath(r'modpython\d') 获得绝对路径,可以将相对路径补全
# 获取某个文件夹下所有文件名(不包括文件夹名)
import os
path = []
def check_file(dir_name):
if os.path.isdir(dir_name): # 判断路径是否为目录
for name in os.listdir(dir_name): # 目录下所有文件和文件夹进行遍历,name 为输入目录下的文件和文件夹名称
new_name = os.path.join(dir_name,name) # 要把上一层的路径加进去,要不然在当前目录下搜索不到下一级的文件名或文件夹名
if os.path.isdir(new_name): # 如果是文件夹就递归
check_file(new_name)
else:
path.append(os.path.abspath(new_name))
else:
path.append(os.path.abspath(dir_name)) # 如果该文件不是目录,则打印该文件的绝对路径
check_file('C') # 这是一个相对路径的目录
print(len(path)) # 获得目录下有多少文件
print(path) # 获得目录下的所有文件的绝对路径
运行结果:
2
['C:\\Users\\宝贝入怀\\Desktop\\10.11\\00_git\\02 Python难点\\C\\CV.txt', 'C:\\Users\\宝贝入怀\\Desktop\\10.11\\00_git\\02 Python难点\\C\\新建文件夹\\bv.txt']
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理
想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!
如何最简单、通俗地理解Python的文件?的更多相关文章
- 如何快速简单粗暴地理解Python中的if __name__ == '__main__'
1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...
- http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章
好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- 如何简单地理解Python中的if __name__ == '__main__'
https://blog.csdn.net/yjk13703623757/article/details/77918633 1. 摘要 通俗的理解__name__ == '__main__':假如你叫 ...
- 如何简单地理解Python中的if __name__ == '__main__'(https://blog.csdn.net/yjk13703623757/article/details/77918633)
1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...
- OSI七层模式简单通俗理解
OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...
- 【转载】如何简单地理解Python中的if __name__ == '__main__'
原帖:https://blog.csdn.net/yjk13703623757/article/details/77918633 通俗的理解__name__ == '__main__':假如你叫小明. ...
- 如何理解python中的if __name__=='main'的作用
一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
随机推荐
- php-fpm和nginx配置
groupadd www-data useradd -g www-data www-data find / -name "php-fpm.conf" 把所有文件下的 改成www-d ...
- php 上传图片,无刷新上传,支持多图上传,远程图片上传
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html ...
- Flink-1-状态化流处理概述
第1章 状态化流处理概述 参考书籍 Stream Processing with Apache Flinkhttps://www.oreilly.com/library/view/stream-pro ...
- php bypass disable_function 命令执行 方法汇总简述
1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...
- 永别了,Dota2!
永别了,Dota2 .输了游戏,我还有人生! 游戏中,总有那些喷子,自己玩的不好,经常说人家! 和大便打架,即使赢了,身上也非常臭! 所以对于这种人,敬而远之即可!不吵不闹,默默把锅扛起!赢了,就好说 ...
- mongodb 副本集之入门篇
作者: 凹凸曼-军军 前言:mongodb 因为高性能.高可用性.支持分片等特性,作为非关系型数据库被大家广泛使用.其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群) ...
- 推荐:国产etl调度工具Taskctl web应用版,0元永久授权
写在前面 2020年疫情席卷全球,更是对整个市场经济造成了严重影响,年初疫情肆虐,西方世界单方面的科技.经济封锁,国际关系吃紧.....导致很多中小型企业业务链受阻,大型企业经费资金吃紧,轮班制导致公 ...
- oracle ddl 与 dml
DDL create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop in ...
- day1(ModelViewSet序列化限流排序)
1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本 7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...
- 2017 Mid Central Regional F.Orderly Class(大水题)
这两天刷了两道过去的原题,看看思维还是8太行. 这道题问给出两个字符串,要求只翻转一次,问有几种不同的方法使得a串变成b串 我一开始没看到只翻转一次,还以为是个计数 + 字符串dp大难题,心想当年的学 ...