视频加载失败

Python 文件

2286 字
11 分钟
Python 文件

文件#

温馨提示

转载请标注来源哦~~

通过本章的学习,你将学习到 Python 中文件的打开、关闭、读写等操作。文章内容来自站主大学时期的课程笔记。

打开文件/创建文件/关闭文件#

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

# open(文件路径,访问模式)
f = open('test.txt', 'w')
f.close()

文件路径:绝对路径、相对路径

访问模式:

访问模式说明
‘r’只读打开(默认)
‘w’写入打开,首先截断文件(覆盖),文件不存在,则创建
‘x’单独创建打开,如果文件已存在则失败
‘a’写入打开,如果文件存在则添加到尾部(append)
‘b’二进制模式
‘t’文本模式(默认)
‘+’更新方式(读、写)打开磁盘文件

完整api

open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, opener=None)
  • buffering

buffering是一个整数可选项,用于设置缓冲策略,传入0关闭缓冲(仅允许在二进制模式下),1选择行缓冲(尽用于文本模式),大于1的整数用于指示某个固定大小的块缓冲区的字节大小。当没有给定buffering参数时,默认缓冲策略运行如下:

二进制文件在固定大小的块内缓冲,缓冲区大小的选择,会使用启发式的方法来尝试决定底层设备的“块尺寸“,并退回至io.DEFAULT_BUFFER_SIZE。在很多系统上,缓冲区通常的字长是4096或8192。 ”交互式“文本文件(对于isatty()返回True的文件)使用行缓冲,其他文本文件使用的策略与上面二进制文件的相同

  • encoding

encoding是用于编码或解码文件的编码名称。该参数应仅用于文本模式,默认的编码是平台依赖的(无论locale.getpreferredencoding()返回什么),但所有Python支持的文本编码都可使用,支持的编码列表参考codecs模块。

文件的读写#

  • 使用write()可以完成向文件写入数据
# 如果文件不存在,那么创建;如果存在那么就先清空,然后写入数据
f = open('test.txt', 'w')
f.write('hello world, i am here!\n' * 5)
f.close()
  • 读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num,那么就表示读取文件中所有的数据

f = open('test.txt', 'r')
content = f.read(5) # 最多读取5个数据
print(content)
print("‐"*30) # 分割线,用来测试
content = f.read() # 从上次读取的位置继续读取剩下的所有的数据
print(content)
f.close() # 关闭文件

正规写法

try:
f = open('test.txt', 'r')
content = f.read() # 从上次读取的位置继续读取剩下的所有的数据
print(content)
finally:
if f:
f.close()

with open

with open('test.txt', 'r') as f:
print(f.read())

可以不用close 类似java try()

  • 读数据(readline)

readline只用来读取一行数据。

f = open('test.txt', 'r')
content = f.readline()
print("1:%s" % content)
content = f.readline()
print("2:%s" % content)
f.close()

常用循环读取

file = open("test.txt")
while True:
text = file.readline()
# 判断是否读取到内容
if not text:
break
print(text)
file.close()
  • 读数据(readlines)

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行为列表的 一个元素

f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
for temp in content:
print(temp)
f.close()

跳过第一行内容(字段名)

with open(file_path,'r',encoding='utf-8-sig') as f
next(f)
all_line_list = f.readlines()

读写非utf-8编码文件,并忽略错误

with open(file_path,'r',encoding='gbk',errors='ignore') as f
all_line_list = f.readlines()

读取二进制文件

with open(file_path,'rb') as f:
f.read()
  • 文件copy
# 1. 打开
file_read = open("test.txt")
file_write = open("test-副本.txt", "w")
# 2. 读、写
text = file_read.read()
file_write.write(text)
# 3. 关闭
file_read.close()
file_write.close()
  • 大文件copy

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了。 要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。例如,read(1024) 每次读取1024个字节的数据内容 调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。 如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是**配置文件,调用readlines()**最方便:

# 1. 打开
file_read = open("test.txt")
file_write = open("test-副本.txt", "w")
# 2. 读、写
while True:
# 读取一行内容
text = file_read.readline()
# 判断是否读取到内容
if not text:
break
file_write.write(text)
# 3. 关闭
file_read.close()
file_write.close()
  • 序列化和反序列化

通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(例如列表、字典、元组等),就无 法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。 设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化,反之,从文件的字 节序列恢复到内存中,就是反序列化。 对象=>字节序列 => 序列化 字节序列=>对象 =>反序列化

Python中提供了JSON这个模块用来实现数据的序列化和反序列化。

JSON提供了dumps和dump方法,将一个对象进行序列化

import json
file = open('names.txt', 'w')
names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']
# file.write(names) 出错,不能直接将列表写入到文件里
# 可以调用 json的dumps方法,传入一个对象参数
result = json.dumps(names)
# dumps 方法得到的结果是一个字符串
print(type(result)) # <class 'str'>
# 可以将字符串写入到文件里
file.write(result)
file.close()

dump方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里

import json
file = open('names.txt', 'w')
names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']
# dump方法可以接收一个文件参数,在将对象转换成为字符串的同时写入到文件里
json.dump(names, file)
file.close()
  • 使用JSON实现反序列化

使用loads和load方法,可以将一个JSON字符串反序列化成为一个Python对象。 loads方法需要一个字符串参数,用来将一个字符串加载成为Python对象。

import json
# 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
result = json.loads('["zhangsan", "lisi", "wangwu", "jerry", "henry", "merry", "chris"]')
print(type(result)) # <class 'list'>

load方法可以传入一个文件对象,用来将一个文件对象里的数据加载成为Python对象。

import json
# 以可读方式打开一个文件
file = open('names.txt', 'r')
# 调用load方法,将文件里的内容加载成为一个Python对象
result = json.load(file)
print(result)
file.close()

os 模块#

os就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。如果该模块中相关功能出错,会抛出OSError异常或其子类异常。

注意,如果是读写文件的话,建议使用内置函数open();如果是路径相关的操作,建议使用os的子模块os.path;如果要逐行读取多个文件,建议使用fileinput模块;要创建临时文件或路径,建议使用tempfile模块;要进行更高级的文件和路径操作则应当使用shutil模块。

此外,导入os模块时还要小心一点,千万不要为了图调用省事儿而将os模块解包导入,即不要使用from os import *来导入os模块;否则os.open()将会覆盖内置函数open(),从而造成预料之外的错误。

os.name#

import os
print(os.name)

查看sys模块中的sys.platform属性可以得到关于运行平台更详细的信息

os.environ#

os.environ属性可以返回环境相关的信息,主要是各类环境变量。返回值是一个映射(类似字典类型),具体的值为第一次导入os模块时的快照;其中的各个键值对,键是环境变量名,值则是环境变量对应的值。在第一次导入os模块之后,除非直接修改os.environ的值,否则该属性的值不再发生变化

os.environ["HOMEPATH"]

os.walk()#

这个函数需要传入一个路径作为top参数,函数的作用是在以top为根节点的目录树中游走,对树中的每个目录生成一个由(dirpath, dirnames, filenames)三项组成的三元组。

for item in os.walk("."):
print(item)

os.listdir()#

“listdir”即“list directories”,列出(当前)目录下的全部路径(及文件)。该函数存在一个参数,用以指定要列出子目录的路径,默认为“.”,即“当前路径”。

def get_filelists(file_dir='.'):
list_directory = os.listdir(file_dir)
filelists = []
for directory in list_directory:
# os.path 模块稍后会讲到
if(os.path.isfile(directory)):
filelists.append(directory)
return filelists

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Python 文件
https://blog.furjesk.com/posts/tutorial-python-file/
作者
Furjesk
发布于
2022-06-06
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Furjesk
读书,应由薄到厚,再由厚到薄
分类
标签
最新动态
站点统计
文章
35
分类
9
标签
51
总字数
71,518
运行时长
0 天
最后活动
0 天前