赞
踩
常见文件的读写分类:
txt
、py
、md
、html
等.csv
,需要借助于系统模块csv
pickle
和json
excel
,word
,需要借助于第三方模块打开文件:f = open(file,mode,encoding)
f = open()
,f
表示被打开的文件对象,后续操作都需要通过f完成读取内容:read()
/readline()
/readlines()
read()
:一次全部读取完毕,适用于数据量少的文件readline()
:一次只能读取一行readlines()
:一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多关闭文件:close()
open(file,mode,encoding)
说明:
file
:需要打开的文件名称或文件的路径
aaa/file1.txt
,推荐c:/users/xxxx/Desktop/Coding5/Day21Code/aaa/file1.txt
mode
:打开文件的模式
模式 | 说明 | |
---|---|---|
'r' | open for reading (default) | 普通文件的读取 |
'w' | open for writing, truncating the file first | 普通文件的写入(删除原文件,生成一个空的新的文件) |
'a' | open for writing, appending to the end of the file if it exists | 普通文件的写入(追加,在原文件内容后添加) |
'rb' | 打开二进制文件用于读取 | |
'wb' | 打开二进制文件用于写入 |
encoding
:
utf-8
、gbk
在Python中,文件路径可以使用正斜杠(/)或反斜杠(\)来表示。这两种方式在大多数情况下都是等效的,但是在某些特定情况下可能会有一些差异。
在Windows操作系统中,反斜杠(\)被用作路径分隔符。因此,如果你在Windows上编写Python代码,通常会使用反斜杠来表示文件路径,例如:
path = 'C:\\Users\\Username\\Documents\\file.txt'
然而,Python也支持使用正斜杠(/)来表示文件路径,即使在Windows上也是如此。这是因为Python解释器会自动将正斜杠转换为适当的路径分隔符。因此,你也可以这样写:
path = 'C:/Users/Username/Documents/file.txt'
在其他操作系统(如Linux和macOS)中,正斜杠(/)被用作路径分隔符。因此,在这些系统上,使用正斜杠表示文件路径是常见的做法。
总而言之,Python中使用正斜杠或反斜杠来表示文件路径都是可以的。选择哪种方式主要取决于你所使用的操作系统和个人偏好。如果你的代码需要在不同操作系统上运行,可以考虑使用os.path
模块提供的函数来处理文件路径,这样可以确保代码在不同平台上都能正常工作。
以访问
txt
文件为例
打开文件:open()
\
,所以使用r
使转义失效f = open(r"d:/word.txt", "r", encoding="utf-8")
01_读取普通文件.py
中访问文件致橡树.txt
f1 = open(r"致橡树.txt", "r", encoding="utf-8")
01_读取普通文件.py
中访问文件夹aaa
中的文件致橡树2.txt
f2 = open(r"aaa/致橡树2.txt", "r", encoding="utf-8")
data
中的text01.py
中访问文件致橡树1.txt
f3 = open("致橡树1.txt", "r", encoding="utf-8")
..
表示回退一级
data
中的text01.py
中访问文件致橡树.txt
f4 = open("../致橡树.txt", "r", encoding="utf-8")
data
中的text01.py
中访问文件夹aaa
中的文件致橡树2.txt
f5 = open("../aaa/致橡树2.txt", "r", encoding="utf-8")
# 2.读取内容:read()/readline()/readlines() # 一次全部读取完毕,适用于数据量少的文件 # r1 = f1.read() # print(r1) # 一次只能读取一行 # r2 = f1.readline() # print(r2) # 一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多 r3 = f1.readlines() print(r3) # 3.关闭文件:close() # 关闭文件,为了节约内存空间 f1.close() # 扩展:结合异常读取文件 # FileNotFoundError # ValueError # LookupError f = None try: f = open(r'致橡树.txt', 'r', encoding='gbk56') print(f.read()) except FileNotFoundError as e: print("文件路径错误:",e) except ValueError as e: print("打开模式错误:",e) except LookupError as e: print("编码错误",e) finally: if f: f.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
读取文件
read()
:一次全部读取完毕,适用于数据量少的文件r1 = f1.read()
print(r1)
输出结果
readline()
:一次只能读取一行r2 = f1.readline()
print(r2)
readlines()
:一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多r3 = f1.readlines()
print(r3)
完整流程
# 1.打开文件:open()
f1 = open(r"致橡树.txt", "r", encoding="utf-8")
# 2.读取内容:readlines()
r3 = f1.readlines()
print(r3)
# 3.关闭文件:close()
f1.close()
拓展
f = None
try:
f = open("致橡树.txt", "r", encoding="utf-8")
read = f.readlines()
print(read)
except FileNotFoundError as e:
print("文件路径错误:", e)
except ValueError as e:
print("操作模式错误:", e)
except LookupError as e:
print("编码格式错误:", e)
finally:
if f:
f.close()
打开文件:f = open(file,mode,encoding)
w
或a
)的时候,文件路径可以不存在,自动生成encoding
的值和源文件的编码格式保持一致'w'
:open for writing, truncating the file first,达到了覆盖的效果'a'
:open for writing, appending to the end of the file if it exit,达到追加内容的效果读取内容:write()
xxx.flush()
关闭文件:close()
# 1.打开文件
# 文件路径存在,直接打开
f2 = open("aaa/file.txt", "w", encoding="utf-8")
# 文件路径不存在,创建并打开
# f2_2 = open("aaa/file2.txt", "w", encoding="utf-8")
# "w"覆盖原文件内容,"a"追加源文件内容
# f2_3 = open("aaa/file2.txt", "a", encoding="utf-8")
# 2.写入文件
f2.write("123")
# 3.关闭文件
f2.close()
在实际应用中,进行读写时,往往会忘记最后的关闭操作,所以可以使用with
语法,简化代码。
所以也更推荐这种写法
with 对象 as 变量:
pass
with open() as f:
读/写
ValueError: I/O operation on closed file.
# 读取操作
with open("致橡树.txt", "r", encoding="utf-8") as f1:
r1 = f1.readlines()
print(r1)
# 写入操作
with open("aaa/file.txt", "w", encoding="utf-8") as f2:
f2.write("123123")
rb
和wb
'rb'
:打开二进制文件用于读取'wb'
:打开二进制文件用于写入ValueError: binary mode doesn't take an encoding argument
# 读取
with open(r"data/py.jpg", "rb") as f1:
data = f1.read()
print(data)
# 写入
with open(r"data/new_py.jpg", "wb") as f2:
f2.write(data)
f2.flush()
csv
csv.reader()
,返回迭代器# csv文件的读写较为特殊,所以需要借助于系统模块csv
import csv
# 1.读取
with open(r'aaa/t1.csv', 'r', encoding='utf-8') as f1:
# 读取csv文件时,使用csv.reader(),返回迭代器
reader = csv.reader(f1) # 相当于f1.read()
print(reader) # <_csv.reader object at 0x00000209A4FAEF40>
# 转成列表,获取元素
datalist = list(reader)
print(datalist)
csv.writer()
,结合writerow()
或writerows()
完成写入操作
writerow(可迭代对象)
:写入一行newline=''
解决# 如果写入内容之后,每行后面出现了空行,则可以通过设置newline=''解决 with open(r'aaa/t2.csv', 'w', encoding='utf-8', newline='') as f2: # 注意3:写入csv文件时,使用csv.writer(),结合writerow()或writerows()完成写入操作 writer = csv.writer(f2) # 注意4:writerow(可迭代对象)或writerows(可迭代对象) # writer.writerow('hello') datalist = [['name', 'age', 'height', 'address'], ['张三', '10', '180', '北京'], ['李四', '20', '165', '上海'], ['王五', '15', '175', '深圳']] # 逐行写入 # for data in datalist: # writer.writerow(data) # 一次性写入多行 writer.writerows(datalist)
Python中一切皆对象
对象的序列化:将Python中的对象持久化到磁盘上
对象的反序列化:将磁盘上一个文件中的内容转换为Python对象
注意事项
pickle可以序列化一切类型
需要pickle序列化对象,则文件的打开方式一定要使用wb
或rb
,类似二进制文件的读写
序列化:pickle.dump(对象,文件对象)
反序列化:pickle.load(文件对象)
需求:将类对象写入文件中,并校验
# 导入模块 import pickle # 创建类 class Person(): def __init__(self, name, age): self.name = name self.age = age def show(self): print(f"姓名:{self.name},年龄:{self.age}") # 创建类对象 per = Person('张三', 10) # 1.序列化(写入) # 需要pickle序列化对象,则文件的打开方式一定要使用wb或rb,类似二进制文件的读写 with open(r"data/a1.txt", 'wb') as f: pickle.dump(per, f) # pickle.dump(对象,文件对象) # 2.反序列化(读取),校验 with open(r"data/a1.txt", 'rb') as f: r = pickle.load(f) # pickle.load(文件对象) print(r) print(r.name, r.age) r.show()
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的文本形式表示结构化数据,并且可以被多种编程语言解析和生成。JSON最初是由Douglas Crockford在2001年提出的,它在Web开发中得到广泛应用。
JSON数据由键值对组成,类似于Python中的字典或JavaScript中的对象。每个键值对由一个键(key)和对应的值(value)组成,键和值之间使用冒号(:)分隔,键值对之间使用逗号(,)分隔。JSON支持以下数据类型作为值:
下面是一个简单的JSON示例:
{
"name": "John",
"age": 30,
"isStudent": False,
"hobbies": ["reading", "coding", "traveling"],
"address": {
"street": "123 Main St",
"city": "上海"
},
"isEmployed": None
}
JSON具有广泛的应用场景,特别是在Web开发中。它常用于在客户端和服务器之间传输数据,以及存储和交换结构化数据。在Python中,可以使用json
模块来解析和生成JSON数据。
JSON | Python | 表示 |
---|---|---|
object | dict | {} |
array | list | [] |
如果中文不需要编码,则可以设置ensure_ascii=False
ensure_ascii的默认值为True,表示对中文进行编码
序列化 | 说明 |
---|---|
json.dump() | 将Python中的字典或列表对象序列化到指定的文件中 |
json.dumps() | 将Python中的字典或列表对象序列化为json字符串 |
反序列化 | 说明 |
json.load() | 将指定的文件中的json字符串反序列化为Python中的字典或列表对象 |
json.loads() | 将json字符串反序列化为Python中的字典或列表对象 |
data = {
"name": "John",
"age": 30,
"isStudent": False,
"hobbies": ["reading", "coding", "traveling"],
"address": {
"street": "123 Main St",
"city": "上海"
},
"isEmployed": None
}
print(data)
print(type(data)) # <class 'dict'>
# 导入模块
import json
# json.dumps():将Python中的字典或列表对象序列化为json字符串
new_json = json.dumps(data, ensure_ascii=False)
print(new_json)
print(type(new_json)) # <class 'str'>
# json.loads():将json字符串反序列化为Python中的字典或列表对象
new_data = json.loads(new_json)
print(new_data)
print(type(new_data)) # <class 'dict'>
# 导入模块
import json
# json.dump():将Python中的字典或列表对象序列化到指定的文件中
with open(r"data/person.json", "w", encoding="utf-8") as f1:
json.dump(data, f1, ensure_ascii=False)
# json.load():将指定的文件中的json字符串反序列化为Python中的字典或列表对象
with open(f"data/person.json", "r", encoding="utf-8") as f2:
new_data = json.load(f2)
print(new_data)
print(type(new_data)) # <class 'dict'>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。