open() 方法

Python 的 open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError

注意: 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode='r')

完整的语法格式为:

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 参数有:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(Python 3 不支持)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

默认为文本模式,如果要以二进制模式打开,加上 b

file 对象

file 对象使用 open() 函数来创建,下表列出了 file 对象常用的函数:

方法 描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型)可以用在如 os 模块的 read() 方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False
file.next() Python 3 中的 File 对象不支持 next() 方法。 返回文件下一行。
file.read(size) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline(size) 读取整行,包括 \n 字符。
file.readlines(sizeint) 读取所有行并返回列表,若给定 sizeint > 0,返回总和大约为 sizeint 字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
file.seek(offset, whence) 移动文件读取指针到指定位置。
file.tell() 返回文件当前位置。
file.truncate(size) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Windows 系统下的换行代表 2 个字符大小。
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

 

filename = 'pi_digits.txt' 
with open(filename) as file_object:
    lines = file_object.readlines()
#with open("/Users/forfuture/PycharmProjects/helloworld/pi_digits.txt") as file_object:
#    lines = file_object.readlines()
for line in lines:
    print(line)
    
print(lines[0])

brith = input("input your number")
if brith in lines:
    print("ok")
else:
    print("no")

读取文件时,python将所有内容都视为字符串,如果读取的是数字,则会变成字符型数字,如果要进行数值运算,要先对它用int()将其变为整数形式 

 

OS 库常用方法

Python 的 os 模块提供了非常丰富的方法用来处理文件和目录。

方法 说明
os.access(path, mode) 检验权限模式
os.chdir(path) 改变当前工作目录
os.chflags(path, flags) 设置路径的标记为数字标记
os.chmod(path, mode) 更改权限
os.chown(path, uid, gid) 更改文件所有者
os.chroot(path) 改变当前进程的根目录
os.close(fd) 关闭文件描述符 fd
os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low(包含)到 fd_high(不包含),错误会忽略
os.dup(fd) 复制文件描述符 fd
os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2
os.fchdir(fd) 通过文件描述符改变当前工作目录
os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数 fd 指定,参数 mode 是Unix 下的文件访问权限
os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户 ID 和用户组 ID,该文件由文件描述符 fd 指定
os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符 fd 指定,但是不强制更新文件的状态信息
os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象
os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name 为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)
os.fstat(fd) 返回文件描述符 fd 的状态,像 stat()
os.fstatvfs(fd) 返回包含文件描述符 fd 的文件的文件系统的信息,Python 3.3 相等于 statvfs()
os.fsync(fd) 强制将文件描述符为 fd的文件写入硬盘
os.ftruncate(fd, length) 裁剪文件描述符 fd 对应的文件,所以它最大不能超过文件大小
os.getcwd() 返回当前工作目录
os.getcwdb() 返回一个当前工作目录的 Unicode 对象
os.isatty(fd) 如果文件描述符 fd 是打开的,同时与 tty(-like) 设备相连,则返回 true,否则 False
os.lchflags(path, flags) 设置路径的标记为数字标记,类似 chflags(),但是没有软链接
os.lchmod(path, mode) 修改连接文件权限
os.lchown(path, uid, gid) 更改文件所有者,类似 chown,但是不追踪链接
os.link(src, dst) 创建硬链接,名为参数 dst,指向参数 src
os.listdir(path) 返回 path 指定的文件夹包含的文件或文件夹的名字的列表
os.lseek(fd, pos, how) 设置文件描述符 fd 当前位置为 poshow 方式修改: SEEK_SET 或者 0 设置从文件开始的计算的 posSEEK_CUR 或者 1 则从当前位置计算;os.SEEK_END 或者 2 则从文件尾部开始。在 Unix,Windows 中有效
os.lstat(path) 像 stat(),但是没有软链接
os.major(device) 从原始的设备号中提取设备 major 号码 (使用 stat 中的 st_dev 或者 st_rdev field)
os.makedev(major, minor) 以 major 和 minor 设备号组成一个原始设备号
os.makedirs(path[, mode]) 递归文件夹创建函数。像 mkdir(),但创建的所有 intermediate-level 文件夹需要包含子文件夹
os.minor(device) 从原始的设备号中提取设备 minor 号码(使用 stat 中的 st_dev 或者 st_rdev field
os.mkdir(path[, mode]) 以数字 mode 的 mode 创建一个名为 path 的文件夹。默认的 mode 是 0777(八进制)
os.mkfifo(path[, mode]) 创建命名管道,mode 为数字,默认为 0666(八进制)
os.mknod(filename[, mode=0600, device]) 创建一个名为 filename 文件系统节点(文件,设备特别文件或者命名管道)
os.open(file, flags[, mode]) 打开一个文件,并且设置需要的打开选项,mode 参数是可选的
os.openpty() 打开一个新的伪终端对。返回 pty 和 tty 的文件描述符
os.pathconf(path, name) 返回相关文件的系统配置信息
os.pipe() 创建一个管道。返回一对文件描述符 (r, w) 分别为读和写
os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道
os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd 对应文件已达到结尾,返回一个空字符串
os.readlink(path) 返回软链接所指向的文件
os.remove(path) 删除路径为 path 的文件。如果 path 是一个文件夹,将抛出 OSError;查看下面的 rmdir() 删除一个 directory
os.removedirs(path) 递归删除目录
os.rename(src, dst) 重命名文件或目录,从 src 到 dst
os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名
os.rmdir(path) 删除 path 指定的空目录,如果目录非空,则抛出一个 OSError 异常
os.stat(path) 获取 path 指定的路径的信息,功能等同于 C API 中的 stat() 系统调用
os.stat_float_times([newvalue]) 决定 stat_result 是否以 float 对象显示时间戳
os.statvfs(path) 获取指定路径的文件系统统计信息
os.symlink(src, dst) 创建一个软链接
os.tcgetpgrp(fd) 返回与终端 fd(一个由 os.open() 返回的打开的文件描述符)关联的进程组
os.tcsetpgrp(fd, pg) 设置与终端 fd(一个由 os.open() 返回的打开的文件描述符)关联的进程组为 pg
os.ttyname(fd) 返回一个字符串,它表示与文件描述符 fd 关联的终端设备。如果 fd 没有与终端设备关联,则引发一个异常
os.unlink(path) 删除文件路径
os.utime(path, times) 返回指定的 path 文件的访问和修改的时间
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下
os.write(fd, str) 写入字符串到文件描述符 fd 中。返回实际写入的字符串长度
os.path 模块 获取文件的属性信息
os.pardir() 获取当前目录的父目录,以字符串形式显示目录名

 

 

os.path 模块

os.path 模块主要用于获取文件的属性。

方法 说明
os.path.abspath(path) 返回绝对路径
os.path.basename(path) 返回文件名
os.path.commonprefix(list) 返回 list(多个路径)中,所有 path 共有的最长的路径
os.path.dirname(path) 返回文件路径
os.path.exists(path) 路径存在则返回 True,路径损坏返回 False
os.path.lexists 路径存在则返回 True,路径损坏也返回 True
os.path.expanduser(path) 把 path 中包含的 “~” 和 “~user” 转换成用户目录
os.path.expandvars(path) 根据环境变量的值替换 path 中包含的 “$name” 和 “​${name}”
os.path.getatime(path) 返回最近访问时间(浮点型秒数)
os.path.getmtime(path) 返回最近文件修改时间
os.path.getctime(path) 返回文件 path 创建时间
os.path.getsize(path) 返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) 判断是否为绝对路径
os.path.isfile(path) 判断路径是否为文件
os.path.isdir(path) 判断路径是否为目录
os.path.islink(path) 判断路径是否为链接
os.path.ismount(path) 判断路径是否为挂载点
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
os.path.normcase(path) 转换 path 的大小写和斜杠
os.path.normpath(path) 规范 path 字符串形式
os.path.realpath(path) 返回 path 的真实路径
os.path.relpath(path[, start]) 从 start 开始计算相对路径
os.path.samefile(path1, path2) 判断目录或文件是否相同
os.path.sameopenfile(fp1, fp2) 判断 fp1 和 fp2 是否指向同一文件
os.path.samestat(stat1, stat2) 判断 stat tuple stat1 和 stat2 是否指向同一个文件
os.path.split(path) 把路径分割成 dirname 和 basename,返回一个元组
os.path.splitdrive(path) 一般用在 Windows 下,返回驱动器名和路径组成的元组
os.path.splitext(path) 分割路径中的文件名与拓展名
os.path.splitunc(path) 把路径分割为加载点与文件
os.path.walk(path, visit, arg) 遍历 path,进入每个目录都调用 visit 函数,visit 函数必须有 3 个参数(arg, dirname, names),dirname 表示当前目录的目录名,names 代表当前目录下的所有文件名,args 则为 walk 的第三个参数
os.path.supports_unicode_filenames 设置是否支持 Unicode 路径名

 

import os.path
f=os.path.abspath("pi_digits.txt")
print(f)

向文件里写入列表

def write_list(path: str, list_1: list):
    # Please write your code
    with open(path,'w') as f:
        f.write(str(list_1))
        f.close()

读写 JSON 文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript 的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C、C++、Java、JavaScript、Perl、Python等)。这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON 在 Python 中分别由 list 和 dict 组成。

json 模块提供了四个功能:dumpsdumploadsload

  • dumps 把数据类型转换成字符串

  • dump 把数据类型转换成字符串并存储在文件中

  • loads 把字符串转换成数据类型

  • load 把文件打开从字符串转换成数据类型

写入 JSON 文件

简介

Python 模块中的 json 模块提供了一个名为 dump() 的方法,它将 Python 对象转换为适当的 JSON 对象。它是 dumps() 方法的一个小变种。

dump() 和 dumps() 的区别

dump() dumps()
当 Python 对象必须被存储在一个文件中时,dump() 方法就会被使用。 dumps() 是在要求对象为字符串格式时使用的,用于解析、打印等。
dump() 需要将输出的 JSON 文件名作为一个参数来存储。 dumps() 并不要求传递任何这样的文件名。
这种方法在内存中写入,然后单独执行写入磁盘的命令。 这个方法直接写到 JSON 文件中
较快的方法 慢 2 倍

dump() 语法: json.dump(d, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None)

参数

  • indent:它提高了 JSON 文件的可读性。可以传递给这个参数的可能值是简单的双引号(””),任何整数值。简单的双引号使每个键值对出现在新的一行。
  • skipkeys:如果键不属于标准允许的类型,如 intfloatstringNone 或 bool,在转储它们时将产生错误。
  • separator:这个参数有一个或两个值。第一个值指定将一个键值对与另一个键值对分开的符号。下一个值指定将值和它的键分开的符号。
  • sort_keys:这个参数采用布尔值。如果它被设置为 True,键将以升序设置,否则,它们将以 Python 对象的形式出现。
  • ensure_ascii:这个参数也只取布尔值。如果它没有被设置为 True,非 ASCII 字符将被原封不动地转入输出文件。默认情况下,该值为 True
  • allow_nan:它有助于序列化浮点数的范围。
# 写入 JSON 数据
import json

data = {
    'name': 'linghu',
    'age': 8
}
with open('demo.json', 'w') as f:
    json.dump(data, f)
    
# 读取文件
# load() 方法
with open('demo.json', 'r') as f:
    print(json.load(f))

# loads() 方法
with open('demo.json', 'r') as f:
    print(json.loads(f.read()))
import json
# 给定一个文件路径 path,文件格式为 json,请你将文件里的数据转换为字典,
# 并修改其中 age 属性,将其改成 18,然后将修改后的字典写回文件里。
def get_write_dict(path:str):
    # Please write your code
    #先打开文件,将文件下载保存后对其数据进行修改
    with open(path,'r') as f:
        f1_dict = json.load(f)
        f1_dict['age'] = 18
    #继续打开文件,将修改后的数据导入原文件中
    with open(path,'w') as f:
        json.dump(f1_dict,f)
        f.close()

读写 CSV 文件

首先,什么是 CSV?
CSV (逗号分隔值)是一种简单的文件格式,用于存储表格数据,例如电子表格或数据库。CSV 文件以纯文本形式存储表格数据(数字和文本)。文件的每一行都是一条数据记录。每条记录由一个或多个字段组成,以逗号分隔。使用逗号作为字段分隔符是此文件格式名称的来源。

对于在 Python 中处理 CSV 文件,有一个名为 csv 的内置模块。

写入 CSV 文件

写入 CSV 文件我们借助 Python 的内置库 csv,生成一个 csvwriter 对象,可以选择一行一行写入,也可以选择一次写入多行。

 

import csv
  
fields = ['Name', 'Branch', 'Year', 'CGPA']
  
rows = [ ['Nikhil', 'COE', '2', '9.0'],
         ['Sanchit', 'COE', '2', '9.1'],
         ['Aditya', 'IT', '2', '9.3'],
         ['Sagar', 'SE', '1', '9.5'],
         ['Prateek', 'MCE', '3', '7.8'],
         ['Sahil', 'EP', '2', '9.1']]
 
  
# writing to csv file
with open('demo.csv', 'w') as csvfile:
    # 创建一个 csv writer 对象
    csvwriter = csv.writer(csvfile)
    # 一次写一行
    csvwriter.writerow(fields)
    # 一次写入多行
    csvwriter.writerows(rows)
    
with open('demo.csv','r') as csvfile:
    csvreader=csv.reader(csvfile)
    print(list(csvreader))

 读取 csv 文件内容,然后将第一行的 ‘name’ 修改成 ‘student_name’,然后将修改后的内容写回 path 中

import csv

def get_write_csv(path:str):
    # Please write your code
    with open(path, 'r') as f:
        csvfile = csv.reader(f)
        csvlist = list(csvfile)
    csvlist[0][0] = 'student_name'

    with open(path, 'w') as f:
        csvfiles = csv.writer(f)
        csvfiles.writerows(csvlist)

读写二进制文件

写入二进制文件

二进制文件(英语:Binary file)一般指包含 ASCII 及扩展 ASCII 字符中编写的数据或程序指令(Program instructions)的文件。广义的二进制文件即为文件,由文件在外部存储设备的存放方式为二进制而得名。狭义的二进制文件即指除文本文件以外的文件。

在 Python 中,通过指定 open 函数的 mode 参数为 wb 就可以写入二进制文件,这里的 w 表示 write 写入 ,b 表示 binary 二进制模式。

示例

data = b'1'

with open('demo.pdf', 'wb') as f:
    f.write(data)

with open('demo.pdf','rb') as f:
    data=f.read()
    print(data,type(data))

 

版权声明:本文为君逸堂原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/changethewld/p/16311661.html