如何最简单、通俗地理解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大家一起来学习讨论吧!
标签:文件,txt,Python,open,ipynb,file,通俗,os 来源: https://www.cnblogs.com/putao11111/p/14115298.html