原文链接: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的文件?的更多相关文章

  1. 如何快速简单粗暴地理解Python中的if __name__ == '__main__'

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  2. http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章

    好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...

  3. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  4. 如何简单地理解Python中的if __name__ == '__main__'

    https://blog.csdn.net/yjk13703623757/article/details/77918633 1. 摘要 通俗的理解__name__ == '__main__':假如你叫 ...

  5. 如何简单地理解Python中的if __name__ == '__main__'(https://blog.csdn.net/yjk13703623757/article/details/77918633)

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  6. OSI七层模式简单通俗理解

    OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...

  7. 【转载】如何简单地理解Python中的if __name__ == '__main__'

    原帖:https://blog.csdn.net/yjk13703623757/article/details/77918633 通俗的理解__name__ == '__main__':假如你叫小明. ...

  8. 如何理解python中的if __name__=='main'的作用

    一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...

  9. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

随机推荐

  1. php-fpm和nginx配置

    groupadd www-data useradd -g www-data www-data find / -name "php-fpm.conf" 把所有文件下的 改成www-d ...

  2. php 上传图片,无刷新上传,支持多图上传,远程图片上传

    1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html ...

  3. Flink-1-状态化流处理概述

    第1章 状态化流处理概述 参考书籍 Stream Processing with Apache Flinkhttps://www.oreilly.com/library/view/stream-pro ...

  4. php bypass disable_function 命令执行 方法汇总简述

    1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...

  5. 永别了,Dota2!

    永别了,Dota2 .输了游戏,我还有人生! 游戏中,总有那些喷子,自己玩的不好,经常说人家! 和大便打架,即使赢了,身上也非常臭! 所以对于这种人,敬而远之即可!不吵不闹,默默把锅扛起!赢了,就好说 ...

  6. mongodb 副本集之入门篇

    作者: 凹凸曼-军军 前言:mongodb 因为高性能.高可用性.支持分片等特性,作为非关系型数据库被大家广泛使用.其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群) ...

  7. 推荐:国产etl调度工具Taskctl web应用版,0元永久授权

    写在前面 2020年疫情席卷全球,更是对整个市场经济造成了严重影响,年初疫情肆虐,西方世界单方面的科技.经济封锁,国际关系吃紧.....导致很多中小型企业业务链受阻,大型企业经费资金吃紧,轮班制导致公 ...

  8. oracle ddl 与 dml

    DDL create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop in ...

  9. day1(ModelViewSet序列化限流排序)

    1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本  7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...

  10. 2017 Mid Central Regional F.Orderly Class(大水题)

    这两天刷了两道过去的原题,看看思维还是8太行. 这道题问给出两个字符串,要求只翻转一次,问有几种不同的方法使得a串变成b串 我一开始没看到只翻转一次,还以为是个计数 + 字符串dp大难题,心想当年的学 ...