前言
家人们,你们的点赞就是我的动力,我又来更新了嘻嘻。这次打算做一个文件操作类题型系列,我想把这类题放在一起会更方便大家理解和学习。
关于如何读文件?
本人一开始一头雾水,所以先去B站大学找了几个视频学习,有了一点基础的概念。所以我会把我认为有用的链接放在这里,建议大家如果也和我刚开始一样一头雾水的话,去看看学习视频再进行文件操作类题型的学习。
1.f=open("./data.txt","r",encoding="utf-8")
# 打开并读取文件
f = open("./data.txt", "r", encoding="utf-8")
content = f.read() # 读取文件的全部内容
print(content) # 打印文件内容
f.close() # 关闭文件
2.with open("./data.txt","r",encoding="utf-8") as fr
# 使用 with 语句打开并读取文件
with open("./data.txt", "r", encoding="utf-8") as f:
content = f.read() # 读取文件的全部内容
print(content) # 打印文件内容
# 文件会在 with 代码块结束后自动关闭
更推荐大家用第二种写法!!!
关于如何写文件?
1.表格总结
'w' | 写入模式(write) | 只能写入文件,如果文件存在则清空内容,不存在则创建新文件。 |
'a' | 追加模式(append) | 只能写入文件,如果文件存在则在末尾追加内容,不存在则创建新文件。 |
'r+' | 读写模式(read and write) | 可读可写,文件必须存在,写入时从文件开头覆盖原有内容。 |
上面这个表格大家只要了解即可,实际上解决题库中的题可以只用到写入模式('w')!!!
十、64 传感器数据分析
64 传感器数据分析http://1.14.58.52/p/64
with open("sensor_data.in","r",encoding="utf-8") as fr,open("sensor_data.out","w",encoding="utf-8") as fw:
for line in fr:
line=line.replace("\n","")
line=line.split() #生成列表
if(float(line[4])>47.00):
fw.write(line[1]+" "+line[4]+"\n")
参考链接:SWUST派森练习题:P64 传感器数据分析_2.下面是一个传感器采集数据文件sensor.txt的一部分: 2018-02-28 01:03:1-CSDN博客
10.1 for line in fr:
一次性读取:将文件的所有行读取到一个列表中,每个列表元素是一行内容。
内存占用:会将整个文件内容加载到内存中,适合小文件。
10.2 line = line.replace('\n', '')
使用字符串的 replace() 方法,将行末的换行符 \n 替换为空字符串,即去除换行符。
十一、P127 信息脱敏
P127 信息脱敏http://1.14.58.52/p/P127
with open("./data.in",'r',encoding='utf-8') as fr,open("./data.out",'w',encoding='utf-8') as fw:
for line in fr:
if line[0]=='姓':
fw.write('姓名:'+line[-2]+'**'+'\n')
elif line[0]=='身':
fw.write('身份证号:'+line[5:11]+'********'+line[-5:])
elif line[0]=='手':
fw.write('手机号:'+line[4:7]+'****'+line[11:])
else:
fw.write(line)
11.1关于文件操作题中的'\n'
这个一定要注意,文件操作题中的\n转义符也要占一个字符位置,相当于字符。所以line[-1]=='\n'!!!还有注意手机号只能填[11:]!!!
十二、P128 csv存json格式
P128 csv存json格式http://1.14.58.52/p/P128
import csv,json
with open('movie.in','r',encoding='utf-8') as fr,open('movie.out','w',encoding='utf-8') as fw:
reader=csv.DictReader(fr)
json.dump(list(reader), fw, indent=4, ensure_ascii=False)
家人们,这个题目我建议直接记住代码。。。毕竟时间紧迫,能省则省哈哈哈。
学习链接我放这里:【Python应用基础-第十一章 文件08 实战 CSV与JSON转换】 Python应用基础-第十一章 文件08 实战 CSV与JSON转换_哔哩哔哩_bilibili
12.1 csv.DictReader
.csv.DictReader 是 Python 内置 csv 模块提供的一个类,用来把 CSV 文件的每一行读成“字典”,而不是普通的字符串列表。
功能 | csv.reader | csv.DictReader |
---|---|---|
每行类型 | 列表 ['Alice', '23', 'Beijing'] | 字典 {'name': 'Alice', ...} |
读取字段 | 通过索引 row[0] | 通过列名 row['name'] |
可读性 | 低(需记忆索引) | 高(直接看列名) |
12.2 json.dump()
.json.dump() 负责把 Python 对象→JSON 文本→写文件;掌握 indent、ensure_ascii 和 default 三大参数就能覆盖 90% 场景。
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None,
indent=None, separators=None, default=None, sort_keys=False)
obj:要被序列化的 Python 对象。
fp:已打开的文件对象(必须有 .write() 方法)。
12.3 ensure_ascii=False
保留非 ASCII 字符(中文、emoji)原样,默认 True 会把中文变成 \uXXXX
12.4 indent=4
注意本题输出格式缩进为4
12.5 CSV,JSON相关总结
读 CSV → Python:用 csv.reader / csv.DictReader
读 JSON → Python:用 json.load / json.loads
写 CSV:用 csv.writer / csv.DictWriter
写 JSON:用 json.dump / json.dumps
方向不同,工具函数就不同,但思路都是“先把外部格式 → Python 内建对象 → 再转成目标格式”。
十三、P133 json格式转存csv文件
P133 json格式转存csv文件http://1.14.58.52/p/P133
#第一种写法,但是在派森中无法AC
import pandas as pd#因为派森没有pandas模块
import json
with open('movie_inf.in', encoding='utf-8') as f:
data = json.load(f) # data 是 list[dict]
df = pd.DataFrame(data) # 一键变表格
df.to_csv('movie_inf.out', index=False, encoding='utf-8-sig')
#第二种写法
import json,csv
with open('movie_inf.in','r',encoding='utf-8')as fr:
txt = json.load(fr)
with open('movie_inf.out','w',newline='',encoding='utf-8')as fw:
writer=csv.DictWriter(fw,fieldnames=txt[0].keys())
# 创建一个 CSV 写入器:
# fieldnames=txt[0].keys():把第一条记录的所有键作为表头(列名)。
# 要求 data 至少是 列表里套字典 且非空(前面已判断)。
writer.writeheader() # 写入表头
writer.writerows(txt) # 一次性把所有字典按行写进 CSV。每行会自动按 fieldnames 的顺序取对应值,缺失的键会留空。
13.1 题干说明
题目中给出的代码作用:把 JSON 文件读进来,变成 Python 能直接用的字典或列表。
13.2 解题步骤
1️⃣先搞清楚 JSON 的形状
A 最外层是 列表,列表里每条记录都是 字典 | [{...}, {...}, ...] | 直接→CSV |
B 最外层是 字典,真正数据在某一键下 | {"movies":[{...}, {...}]} | 先取 data["movies"] 再→CSV |
2️⃣对症下药(大家可以直接跳到第三点,因为前两个派森不能用)
(1)列表套字典(最常见)
import pandas as pd
import json
with open('movie_inf.in', encoding='utf-8') as f:
data = json.load(f) # data 是 list[dict]
df = pd.DataFrame(data) # 一键变表格
df.to_csv('movie_inf.csv', index=False, encoding='utf-8-sig')
(2)字典再包列表
import pandas as pd
import json
with open('movie_inf.in', encoding='utf-8') as f:
wrapper = json.load(f) # wrapper 是 dict
records = wrapper['movies'] # 假设数据在 'movies' 键下
pd.DataFrame(records).to_csv('movie_inf.csv', index=False, encoding='utf-8-sig')
(3)派森中因为没有pandas模块,所以以上两种方法都不能用,只能用另一种方法
import json, csv
with open('movie_inf.in', encoding='utf-8') as fr:
data = json.load(fr)
# 如果是 B 型,先解开 # data = data['movies']
if not data: # 防止空文件
exit()
with open('movie_inf.out', 'w', newline='',encoding='utf-8') as fw:
#在 Windows 上写 CSV 文件,务必加 newline='',防止出现一行空白一行内容
writer = csv.DictWriter(fw, fieldnames=data[0].keys())
#创建一个 CSV 写入器:
#fieldnames=data[0].keys():把第一条记录的所有键作为表头(列名)。
#要求 data 至少是 列表里套字典 且非空(前面已判断)。
writer.writeheader()#写入表头
writer.writerows(data)#一次性把所有字典按行写进 CSV。每行会自动按 fieldnames 的顺序取对应值,缺失的键会留空。