【Python爬虫与数据分析】文件读写

目录

一、概述

二、txt文件读写

三、csv文件读写

四、Json文件读写


一、概述

读写模式:

  • r:读数据
  • w:覆盖写入
  • a:追加写入
  • rb:以二进制形式读出
  • wb:以二进制形式写入
  • ab:以二进制形式追加
  • r+w+a+:可读可写

编码方式:

  • GBK:ASCII字符编码是单字节编码,无法处理汉字。1981年中国提出GB2312的双字节字符编码,又称GB0,共收录6763个汉字,同时兼容ASCII编码,基本满足了汉字的使用需求,但是依然无法满足100%的汉字需求,于是在GB2312的基础上提出了GBK编码,满足了全部汉字的使用需求。GBK不仅收录了27484个汉字,还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,同时GBK也是兼容ASCII编码的,英文字符占用1字符,汉字字符占用2字符
  • Unicode:为了解决全球不同语言的编码问题,统一联盟国际组织提出了Unicode编码它为世界上每种语言的每一个字符定义了一个唯一的字符码。Unicode的学名是 "Universal Multiple-Octet Coded Character Set",简称UCS,Unicode的两种格式分别是UCS-2和UCS-4,分别占用2个字节和4个字节。Unicode编码使用定长格式,会造成严重的空间浪费,比如原本只占用1个字符的英文字符也需要2个或4个字节长度。
  • utf-8:为了避免字符对空间的浪费,出现了Unicode Transformation Format组织,学术名UTF,即对unicode字符转换,以便于在存储和网络通信时节省空间。utf-8是UTF组织提出的 编码格式中应用最为广泛的一种变长的字符编码,可以根据具体情况用1~4个字符来表示一个字符。
  • utf-8-sig:在Windows系统上使用open打开utf-8编码的文件时开头会有一个多余的字符BOM(ByteOrder Mark),它是用来声明该文件的编码信息。“utf-8”是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,所以当用“utf-8”编码方式读取带有BOM的文件时,它会把BOM当作是文件内容进行处理,出现报错。“utf-8-sig”编码中的“sig”的全拼是signature,也就是带有签名的utf-8,因此“utf-8-sig”读取带有BOM的“utf-8”文件时会把BOM单独处理,与文本内容隔离开,也就是我们期待的结果。

  读写方式一:直接将文件打开,文件操作结束时手动关闭文件

f = open('test.txt', 'w', encoding='gbk')
f.write('hello world\n')
f.close()f = open('test.txt', 'a', encoding='utf-8')
f.write('窗前明月光\n疑是地上霜\n举头望明月\n低头思故乡\n')
f.close()f = open('test.txt', 'r', encoding='utf-8-sig')
text = f.read()     # 将文本内容全部读出
print(text)
f.close()

读写方式二:使用上下文管理器,文件操作结束时自动关闭文件

with open('test.txt', 'r', encoding='utf-8-sig') as f:text = f.readlines()   # 读取所有行,以列表的方式返回print(text)

二、txt文件读写

write:字符串写入

with open('test.txt', 'w', encoding='utf-8-sig') as f:stu_id = 10000for i in range(100):stu_name = '张三'stu_phone = '12345678900'data = str(stu_id) + ' ' + stu_name + ' ' + stu_phone + '\n'f.write(data)stu_id += 1

writelines:字符串序列写入

stu_info_lst = []
with open('test.txt', 'w', encoding='utf-8-sig') as f:stu_id = 10000for i in range(100):stu_name = '张三'stu_phone = '12345678900'data = str(stu_id) + ' ' + stu_name + ' ' + stu_phone + '\n'stu_info_lst.append(data)stu_id += 1f.writelines(stu_info_lst)

read:读取全部文本内容

with open('test.txt', 'r', encoding='utf-8-sig') as f:text = f.read()print(text)

readlines:按行读取文本内容并存储列表

with open('test.txt', 'r', encoding='utf-8-sig') as f:text = f.readlines()for line in text:print(line, end='')

三、csv文件读写

csv(comma-separated values)是跨多种形式导入导出数据的标准格式,如MySQL、Excel......

csv以纯文本存储数据,文件的每一行就是一条数据每条数据通过逗号区分字段

在python的csv模块中,我们可通过reader、writer、DictReader、DictWriter的方式将csv文件作为参数传递给一个读写对象,而reader / writer 和 DictReader / DictWriter 的区别是前者是通过列表或元组格式将数据逐条进行读写,后者是通过字典格式将数据进行读写。

csv文件的读写的每条数据(每行)支持多种类型(整型、浮点型、字符串、时间),每个字段(每列)的格式统一,多个字段通过列表、元组、字典的数据结构打包成一条条数据进行读写,但是数据结构之间不允许嵌套。

readerwriter

import csvwith open('test.csv', 'w', encoding='utf-8-sig', newline='') as f:write_object = csv.writer(f)stu_id = 10000for i in range(100):stu_name = '张三'stu_phone = '12345678900'stu_high = 175.5data = [stu_id, stu_name, stu_phone, stu_high]# data = (stu_id, stu_name, stu_phone, stu_high)write_object.writerow(data)stu_id += 1with open('test.csv', 'r', encoding='utf-8-sig') as f:read_object = csv.reader(f)for line in read_object:stu_id = line[0]stu_name = line[1]stu_phone = line[2]stu_high = line[3]print(stu_id, stu_name, stu_phone, stu_high)

DictReaderDictWriter

import csvwith open('test.csv', 'w', encoding='utf-8-sig', newline='') as f:headers = ['stu_id', 'stu_name', 'stu_phone', 'stu_high']write_object = csv.DictWriter(f, headers)write_object.writeheader()      # 写入标题行,定义字典的KEY值stu_id = 10000for i in range(100):stu_name = '张三'stu_phone = '12345678900'stu_high = 175.5data = {'stu_id': stu_id,'stu_name': stu_name,'stu_phone': stu_phone,'stu_high': stu_high}write_object.writerow(data)stu_id += 1with open('test.csv', 'r', encoding='utf-8-sig') as f:read_object = csv.DictReader(f)for line in read_object:stu_id = line['stu_id']stu_name = line['stu_name']stu_phone = line['stu_phone']stu_high = line['stu_high']print(stu_id, stu_name, stu_phone, stu_high)

四、Json文件读写

json字符串:通常类似python数据类型中的列表和字典的结合,也可能是单独的列表或者字典格式,通常可以通过json模块的函数接口转换为python数据类型,也可将python中的数据类型转换成json字符串。

json文件:后端通常将数据库的文件统一以json文件的格式传给前端,而前端在对json文件数据进行加工渲染,展示在前端页面。

很多时候,我们使用爬虫从前端页面获取的数据因为经过了加工渲染而并不完整,所以我们有时候需要通过获取后端的json文件数据包来获取数据。

将python数据转换为json字符串时,json的内部数据是unicode编码,汉字在json字符串中无法显示为中文字符,但是将json字符串做数据提取时,可将unicode编码转化为中文字符。

import jsonstu_info_lst = []
for i in range(100):stu_id = 10000 + istu_name = '张三'stu_phone = '12345678900'data = {'stu_id': stu_id,'stu_name': stu_name,'stu_phone': stu_phone}stu_info_lst.append(data)# 数据为一行写入json文件
with open('stu_info1.json', 'w', encoding='utf-8-sig') as f:json.dump(stu_info_lst, f)# 数据分行写入json文件
with open('stu_info2.json', 'w', encoding='gbk') as f:json.dump(stu_info_lst, f, indent=4)# python数据类型和json字符串之间的相互转换
json_text = json.dumps(stu_info_lst)
python_text = json.loads(json_text)
for i in python_text:s_id = i['stu_id']s_name = i['stu_name']s_phone= i['stu_phone']print(s_id, s_name, s_phone)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8090.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript 总结

文章目录 TypeScript 总结概述运行ts文件方式一方式二 基础声明变量类型数组元组联合类型取值限制 枚举类型any & unknownvoid & undefined类型适配 面向对象函数普通函数箭头函数可选参数默认参数 对象创建对象对象的类型限制 类和接口泛型简单使用多个泛型默认泛型类…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天,继续加油 今日案例来源:csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额,输出实际付款金额。购货折扣率如下: 购货金额≤500元…

obs录制功能源码分析

录制按钮 界面文件: 主界面:OBSBasic.ui 中开始录制按钮的objectName 是 recordButton 槽函数: void OBSBasic::on_recordButton_clicked() {//1 输出模式是否被激活if (outputHandler->RecordingActive()) {bool confirm config_get_bool(GetGlo…

LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结 现算法已经开源,代码链接: GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM. 背景 SLAM(同时定位与地图构建)是一种让机器人在构建环境地图的同时,定位…

Spring整合Junit单元测试

1.Spring整合Junit单元测试 1.1 原始Junit测试Spring的问题 在测试类中,每个测试方法都有以下两行代码: ApplicationContext ac new ClassPathXmlApplicationContext("application.xml");BookDao bookDao (BookDao)ac.getBean("bookDa…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

软考:中级软件设计师:计算机存储结构,cache,局部性原理,RAM和ROM,磁盘结构和计算

软考&#xff1a;中级软件设计师:计算机存储结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

用git下载gitee上的项目资源

目录 用git下载gitee上的项目资源 用git 的clone 命令 然后到gitee上复制相关的下载地址&#xff1a; 粘贴到clone后面即可&#xff08;注意地址与clone之间有空格&#xff01;&#xff01;&#xff01;&#xff09; 运行结果&#xff1a; 用git下载gitee上的项目资源 用git…

软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式 概述 行为型设计模式是软件设计模式中的一类&#xff0c;用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;&#xff1a;定义了…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…