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

news2024/11/16 0:24:12

目录

一、概述

二、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 = 10000
    for 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 = 10000
    for 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 += 1
    f.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 csv

with open('test.csv', 'w', encoding='utf-8-sig', newline='') as f:
    write_object = csv.writer(f)

    stu_id = 10000
    for i in range(100):
        stu_name = '张三'
        stu_phone = '12345678900'
        stu_high = 175.5
        data = [stu_id, stu_name, stu_phone, stu_high]
        # data = (stu_id, stu_name, stu_phone, stu_high)

        write_object.writerow(data)
        stu_id += 1

with 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 csv

with 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 = 10000
    for i in range(100):
        stu_name = '张三'
        stu_phone = '12345678900'
        stu_high = 175.5
        data = {
            'stu_id': stu_id,
            'stu_name': stu_name,
            'stu_phone': stu_phone,
            'stu_high': stu_high
        }
        write_object.writerow(data)
        stu_id += 1

with 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 json

stu_info_lst = []
for i in range(100):
    stu_id = 10000 + i
    stu_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.coloradmin.cn/o/731471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java log 日志

文章目录 log4j.properties配置 log4j.properties 配置 log4j.rootLoggerINFO, stdoutlog4j.appender.stdoutorg.apache.log4j.ConsoleAppender log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern%d{yyyy-MM-dd H…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet,并对表进行插入、更新与删除操作,pet表结构如表8.3所示。 (1)首先创建数据表pet,使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

网络安全(黑客)内网渗透基础知识

0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

交叉导轨的结构与特长

在交叉导轨中,精密滚柱互相直交地组合在一起的滚柱保持架与设置在专用轨道上的90V形沟槽滚动面组合起来使用。通过将2列滚子导轨平行地装配,使导轨系统能承受4个方向的负荷。而且,因能向交叉滚子导轨施加预压,从而能获得无间隙且高…

zookeeper单机安装

1 检查环境jdk 参考:https://blog.csdn.net/weixin_44098426/article/details/128446376 2 解压安装包 mkdir -p /opt/zookeeper mv /home/wh/software/zk/apache-zookeeper-3.5.7-bin.tar.gz /opt/zookeeper tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz 3 配置…

在Windows环境下安装Elasticsearch 8.8.2

Elasticsearch是一种开源的分布式搜索和分析引擎,被广泛应用于构建实时搜索、日志分析、数据可视化等应用。本文将详细介绍如何在Windows环境下安装和配置Elasticsearch 8。 安装Elasticsearch 步骤1:准备工作 在开始安装之前,确保已满足以…

多元回归预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost回归预测,GWO-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost回归预测,GWO-XGBoost回归预测模型,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源…

GPON MAC SFP ONU模块介绍与应用

伴随着网络通讯技术的发展,pon无源光网络正逐步走进人们的视野;在这之前你是否仅知道以太网接入?相比与以太网接入,pon作为一种点到多点网络,具有运维成本低、服务范围广、资源占用少等优势;我们最为熟知的…

CSS自学框架之漂浮提示(上方显示 底侧显示 右侧显示 左侧显示)

漂浮提示可以用较为隐藏的方式为用户提供帮助或引导信息,将鼠标移入文字内容后展示。 css代码: /* 浮漂提示框 */[myth-tag]{ position: relative }[myth-tag]:before, [myth-tag]:after{z-index: 1;opacity: 0;position: absolute;pointer-events: non…

LVS负载均衡集群之LVS-NAT集群

目录 一、什么是集群? 1.1、集群(cluster)的含义 1.2、问题 1.3解决方法 二、集群分类 2.1、负载均衡集群(Load Balance Cluster) 2.2、高可用集群(High Availability Cluster) 2.3、高性能运算集群 (High Performance Computer Clust…

企业服务器数据库被360后缀勒索病毒攻击后的正确处理方式

在数字化时代,企业服务器数据库的安全性至关重要。然而,即使采取了各种安全措施,仍然有可能遭受到360等后缀的勒索病毒网络攻击。近期,很多企业的云服务与物理服务器遭到了360后缀的勒索病毒攻击,导致企业内部数据库中…

能够ping通服务器的同时端口不通的排查方法

概述 当您在客户端访问目标服务器时,如果能ping通,但业务端口无法访问,您可以参见以下方法进行排查。 步骤一:实例安全组检查 1、登录ECS管理控制台,单击实例。 2、在顶部菜单栏左上角处,选择地域。 3、…

Visual Studio下2022Opencv的配置

Visual studio2022 opencv的配置 先从官网下载opencv : opencv releases 下载 ​ 我这里的开发环境是window版本,我们选择Windows版本进行下载 点开下载的文件,输入需要保存的路径 记住你保存的路径(我这里安装再F:) 安装需要时间静等安装…

修改Jeecg-boot context-path(附加图片+Nginx配置)

文章目录 需求描述解决方案前端后端Nginx 需求描述 前端框架采用的是ant design vue ,后端框架采用的是jeecg-boot,前端请求后端地址中包含jeecg-boot字样,想修改为其它的名字,修改方式如下 解决方案 前端 第一步 request.js文件路径:src…

2个好用的ftp和ssh工具推介

为什么不用xshell和xftp,是不好用吗?xshell和xftp虽然好用,而且也有免费版,但是,一个方面使用有限制,再就是你看见这个报错的弹窗烦不烦? 一、ssh工具-WindTerm WindTerm[1] 是一个基于 C 开发的开源终端模…

【Go】Go 语言教程--GO条件和循环语句(八)

往期教程: Go 语言教程–介绍(一)Go 语言教程–语言结构(二)Go 语言教程–语言结构(三)Go 语言教程–数据类型(四)Go 语言教程–语言变量(五)Go …

红队打靶,红日系列,红日靶场2

文章目录 描述:环境搭建:外网渗透:漏洞利用冰蝎连接,拿到shell 内网渗透转站CSCS插件提权 域渗透与横向移动 描述: 红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练习、视频教程、博客三位一…

Kotlin~Command模式

概念 把请求转化为独立的对象 角色介绍 Command: 命令接口ConcreteCommand: 具体命令实现类 UML 代码实现 interface Command {fun execute(vararg arg: String):Int } class Print : Command {override fun execute(vararg arg: String): Int {println("Print:${arg…

代码随想录算法训练营第十二天 | 二叉树系列3

二叉树系列3 二叉树 看到二叉树就想到递归404 左叶子之和重点代码随想录的代码我的代码(当日晚上自己理解后写) 513 找树左下角的值重点代码随想录的代码我的代码(当日晚上自己理解后写) 112 路径总和未看讲解,自己编写的青春稚嫩版重点代码随想录的代码我的代码(当…

加解密简单了解之DH密钥协商与AES128

加解密简单了解 1、对称加密与非对称加密 对称加密概念:加密算法是公开的,靠的是秘钥来加密数据,使用一个秘钥加密,必须使用相同的秘钥才解密。 优点: 算法公开、计算量小、加密速度快、加密效率高 缺点:…