Python 文件读取

news/2024/4/18 9:20:54/文章来源:https://blog.csdn.net/hj1993/article/details/129869093

1、CSV 文件存储

1.1 写入

简单示例

import csvwith open('data.csv', 'a') as csvfile:writer = csv.writer(csvfile)       # 初始化写入对象,传入文件句柄writer.writerow(['id', 'name', 'age'])      # 调用 writerow() 方法传入每行的数据writer.writerow(['1', 'rose', '18'])writer.writerow(['2', 'john', '19'])

以文本方式打开,分隔符默认为逗号(,):

id,name,age1,rose,182,john,19

修改默认分隔符:

writer = csv.writer(csvfile, delimiter=' ')   	# 以空格为分隔符

同时写入多行:

# 此时参数为二维列表
writer.writerow([['1', 'rose', '18'], ['2', 'john', '19']])

避免出现空行,可以在写入时加 newline=''

with open("test.csv", "a+", newline='') as csvfile:

如果数据源是字典

import csvwith open('data1.csv', 'a') as csvfile:fieldnames = ['id', 'name', 'age']      # 定义表头writer = csv.DictWriter(csvfile, fieldnames=fieldnames)         # 初始化一个字典,将文件句柄和表头传入writer.writeheader()        # 写入表头writer.writerow({'id': '1', 'name': 'rose', 'age': 18})     # 写入表格中具体内容

编码问题,需要指定 open() 函数编码格式:

open('data.csv', 'a', encoding='utf-8')

另外 pandas 库的 DataFrame 对象的 to_csv() 方法也可以将数据写入 csv 中。

1.2 读取

import csvwith open('data1.csv', 'r') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)

结果如下:

['id', 'name', 'age']
['1', 'rose', '18']

Tips:如果有中文需要指定文件编码


pandas 库的 read_csv() 方法

import pandas as pddf = pd.read_csv('data.csv')
print(df)

运行结果如下:

   id  name  age
0   1  rose   18
1   2  john   19

1.3 避免重复插入表头

#newline的作用是防止每次插入都有空行    
with open("test.csv", "a+", newline='') as csvfile:		# 必须使用 a+,追加方式writer = csv.writer(csvfile)#以读的方式打开csv 用csv.reader方式判断是否存在标题。with open("test.csv", "r", newline="") as f:reader = csv.reader(f)if not [row for row in reader]:writer.writerow(["型号", "分类"])writer.writerows([[keyword, miaoshu]])else:writer.writerows([[keyword, miaoshu]])

示例

爬取一下该网站的所有评论:https://www.bestbuy.ca/en-ca/product/hp-hp-officejet-pro-6968-all-in-one-inkjet-printer-with-fax-6968/10441056/review

import requests
import time
import csvheaders = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) ""Version/11.0 Mobile/15A372 Safari/604.1","Referer": "https://www.bestbuy.ca/en-ca/product/hp-hp-officejet-pro-6968-all-in-one-inkjet-printer-with-fax-""6968/10441056/review"}def get_content(url):"""爬取数据"""res = requests.get(url=url, headers=headers)# print(res.status_code)return res.json()def parse_res(res):"""解析数据"""csv_data = {}# print(res, type(res))data = res["reviews"]for i in data:csv_data["title"] = i["title"]csv_data["comment"] = i["comment"]csv_data["publish"] = i["reviewerName"]csv_data["publish_time"] = i["submissionTime"]print(csv_data)save_data(csv_data)def save_data(csv_data):"""存储数据"""with open('data.csv', 'a+', newline='') as csvfile:# 以读的方式打开 csv,判断表格是否有数据with open('data.csv', 'r', newline='') as f:reader = csv.reader(f)fieldnames = ['title', 'comment', 'publish', 'publish_time']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)		# DictWriter: 字典if not [row for row in reader]:writer.writeheader()writer.writerow(csv_data)else:writer.writerow(csv_data)if __name__ == '__main__':for i in range(1, 11):url = 'https://www.bestbuy.ca/api/v2/json/reviews/10441056?source=all&lang=en-CA&pageSize=10&page=%s' \'&sortBy=date&sortDir=desc' % ires = get_content(url)time.sleep(2)parse_res(res)

参考文章:https://blog.csdn.net/qq_41817302/article/details/88680886

1.4 避免读取第一行表头

import csvl = []FileObj = open('t.csv')
readerObj = csv.reader(FileObj)for row in readerObj:if readerObj.line_num == 1:		# readerObj.line_num 会返回 csv 文件的行数continuel.append(row)print(l)
FileObj.close()
[['1', 'rose', '18'], ['2', 'lila', '19']]

2. JSON 文件存储

2.1 读取 JSON

import jsons = '''[{"name": "rose","gender": "female","age": "18"}]
'''data = json.loads(s)
print(data)
print(type(data))

运行结果如下:

[{'name': 'rose', 'gender': 'female', 'age': '18'}]
<class 'list'>			# 因为最外层是列表

读取 JSON 文件

with open('data.json', 'r') as f:s = f.read()data = json.loads(s)print(data)

2.2 输出 JSON

import jsondata = [{"name": "rose","gender": "female","age": "18"}]with open('data.json', 'a') as f:f.write(json.dumps(data))

缩进 2 个字符,这样结构更清晰:

with open('data.json', 'a') as f:f.write(json.dumps(data, indent=2))

运行结果如下:

[{"name": "rose","gender": "female","age": "18"}
]

如果输出的包含中文,须臾指定参数 ensure_ascii=False,否则默认转换为 Unicode 字符:

with open('data.json', 'a') as f:f.write(json.dumps(data, indent=2, ensure_ascii=False))

3. configparser 模块

基本方法

  • 读取配置文件
    • defaults():返回默认 DEFAULT 的值,类型字典
    • read(filename):读取配置文件内容
    • sections():返回所有 section, 类型列表
    • options(section):返回指定 section 的键值对
    • items(section):获取指定 section 所有的键值对
    • get(section, option) 获取指定 section 中 option 的值
    • getint(section, option) 获取指定 section 中option 的值,以 int 类型返回
    • getfloat(section, option) 获取指定 section 中 option 的值,以 float 类型返回
    • getboolean(section, option) 获取指定section 中 option 的值,以 boolean类型返回
  • 写入配置文件
    • add_section(section) 添加指定的新的 section
    • has_section(section) 判断是否存在指定的 section
    • set(section, option, value) 设置指定 section 中 option 的值
    • remove_section(section) 删除指定 section
    • remove_option(section, option) 删除指定 section 中的 option
    • write(fileobject) 将内容写入配置文件

1. 示例:读取、写入 DEFAULT

import configparsercf = configparser.ConfigParser()
cf.read("user", encoding="utf-8")cf["DEFAULT"] = {"name": 'rose',"age": 18,"gender": "female"
}with open("user", 'w')as f:cf.write(f)# 读取
result_dict = cf.defaults()  # 获取默认 DEFAULT,没有就返回空的字典 OrderedDict()
print(result_dict)

运行结果:

[DEFAULT]
name = rose
age = 18
gender = femaleOrderedDict([('name', 'rose'), ('age', '18'), ('gender', 'female')])

2. 示例二:逐行读取(读取单个 option)

def read_ini(section, option):"""读取 ini 文件"""try:config = configparser.RawConfigParser()config.read('ui', encoding='gbk')content = config.get(section, option)return contentexcept Exception as ex:print(ex)

3. 读取所有key-value

1、user

[audio]
name = rose
age = 18
gender = female[video]
width = 1980
height = 1080

2、读取所有 key-value

def read():"""读取配置文件"""results = {}cf = configparser.ConfigParser()cf.read('user', encoding='gbk')# 全部读取并写入到字典中for section in cf.sections():temp = {section: {}}options = cf.options(section)for i in options:temp[section].update({i: cf.get(section, i)})results.update(temp)print('results===>', results)return results

运行结果:{'audio': {'name': 'rose', 'age': '18', 'gender': 'female'}, 'video': {'width': '1980', 'height': '1080'}}

4. 以字典形式存取

cf = configparser.ConfigParser()
cf['encode'] = {'bitrate_type': 0,'bitrate': 25,'goplen': 40,
}cf['system'] = {'version': '1.0.2','hmode': 1686
}with open("ui", "w+") as f:cf.write(f)

5. 写入

def user_write(self, results: dict):"""将用户信息写入配置文件{"mac": {"mac": "1111111111"}}"""cf = configparser.ConfigParser()results_dic = {k1: v1 for k1, v1 in results.items() if isinstance(v1, dict)}for k2, v2 in results_dic.items():if not .cf.has_section(k2):cf.add_section(k2)for k3, v3 in v2.items():if not cf.has_option(k2, k3):cf.set(k2, k3, v3)with open('user', 'w+') as f:cf.write(f)

参考

  • configparser 模块的基本方法:https://www.cnblogs.com/gexbooks/p/12103709.html
  • python:利用configparser模块读写配置文件:https://www.cnblogs.com/imyalost/p/8857896.html

4. shutil 模块

复制、改名和删除文件、文件夹

4.1 复制文件和文件夹

  • copy(source, dest):拷贝文件,返回被拷贝文件后的路径(字符串)
  • copytree(source, dest):拷贝文件夹/目录,返回被拷贝文件夹后的路径(字符串)

a、b 两个文件夹在同级目录,a 中有一个文件 s1.py,b 中为空:

>>> import shutil>>> shutil.copy('a/s1.py', 'b')     # 使用默认名称
'b\\s1.py'>>> shutil.copy('a/s1.py', 'b/s2.py')   # 重新命名
'b/s2.py'>>> shutil.copytree('a', 'b\\a')
'b\\a'

4.2 文件和文件夹的移动和重命名

  • 移动文件,原有文件将会被删除,返回新位置的绝对路径
  • 若目标路径是一个文件夹,那么文件将被移动到文件夹中
  • 若目标路径不存在,那么将重命名为那个路径
  • 若目标路径中存在同名文件,则会被覆盖
>>> shutil.move('a\\s1.py', 'b')
'b\\s1.py'# c 文件夹不存在,s1.py 重命名为 c
>>> shutil.move('b\\s1.py', 'c')
'c'# 重命名
>>> shutil.move('b\\s1.py', 'a\\s2.py')
'a\\s2.py'

4.3 删除文件和文件夹

  • os.unlink(path):删除 path 处的文件
  • os.rmdir(path):删除 path 处的文件夹,该文件夹必须为空
  • shutil.rmtree(path):删除 path 处所有文件及文件夹

4.4 安全删除文件

send2transh 模块不会永久删除文件,而是将其移动到回收站,以便恢复,而 os.unlink()、shutil.rmtree() 是永久删除:

pip install send2trashsend2trash.send2trash('a.py')

4.5 遍历目录树

os.walk(path) 返回:

  • 当前文件夹
  • 当前文件夹中的子文件夹字符串列表
  • 当前文件夹中的文件字符串列表

目录结构:

a- b- s1.py
s1.py
b

示例:

# -*- coding: utf-8 -*-import osfor folderName, subfolders, filenames in os.walk('a'):print('当前文件夹:', folderName)for subfolder in subfolders:print('子文件夹:', subfolder)for filename in filenames:print('文件:', filename)# >>> for folderName, subfolders, filename in os.walk('a'):
# ...     print('当前文件夹:{},当前文件夹中子文件的字符串列表:{},当前文件夹中文件字符串列表:{}'.format(folderName, subfolders, filename))
# ...
# 当前文件夹:a,当前文件夹中子文件的字符串列表:['b'],当前文件夹中文件字符串列表:['s1.py']
# 当前文件夹:a\b,当前文件夹中子文件的字符串列表:[],当前文件夹中文件字符串列表:[]

运行结果:

当前文件夹: a
子文件夹: b
文件: s1.py
当前文件夹: a\b

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

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

相关文章

追赶ChatGPT,我们的差距在哪里?

又一家中国互联网巨头在追赶ChatGPT了。 3月底举行的博鳌亚洲论坛上&#xff0c;腾讯集团高级执行副总裁汤道生披露&#xff0c;腾讯正在研发AIGC以及大模型相关技术&#xff0c;类ChatGPT的对话机器人也在酝酿中。 百度、华为&#xff0c;如今再加上腾讯&#xff0c;ChatGPT出…

vuepress复杂网站开发后记

前段时间写了一篇vuepress2的开发文章&#xff0c;很多前端小伙伴看&#xff0c;给了我很多鼓励&#xff0c;写这个的原因是我们的百家饭OpenAPI平台是用vuepress搭建的&#xff0c;最开始选型是因为开始的时候觉得只是一个介绍性的产品网站&#xff0c;所以选型用了类似vue的v…

折叠洗衣机亚马逊美国站UL60335报告如何办理?

洗衣机是利用电能产生机械作用来洗涤衣物的清洁电器&#xff0c;按其额定洗涤容量分为家用和集体用两类。中国规定洗涤容量在6千克以下的属于家用洗衣机&#xff1a;家用洗衣机主要由箱体、洗涤脱水桶&#xff08;有的洗涤和脱水桶分开&#xff09;、传动和控制系统等组成&…

绝不告诉你!黑客如何攻击你的Facebook账户

Facebook是全球使用最广泛的社交网络之一。然而&#xff0c;这也意味着黑客会不断寻找攻击用户并窃取他们信息的漏洞。在这篇文章中&#xff0c;我将介绍一些黑客攻击Facebook账户的常见方法&#xff0c;并提供一些保护自己的提示。 1.假冒登录页面 黑客们可以伪造Facebook的…

mycat2 安装 jDK

文章目录进入解压的JDK路径查看完整路径1、卸载系统自带的OpenJDK以及相关的java文件输入java-verison可以看到系统自带的OpenJDK版本信息。命令说明&#xff1a;rpm   管理套件-qa   使用询问模式&#xff0c;查询所有套件grep  查找文件里符合条件的字符串java   查找…

Melis4.0[D1s]:4.测试笔记 - 内嵌的显示命令

文章目录1.配置将显示测试源码包含进工程&#xff08;默认是包含了&#xff09;2.不要启动melis桌面系统3.开始测试3.1 disp 命令3.1.1 disp不带参数时&#xff0c;打印显示信息&#xff1a;3.1.2 disp -c 0 8 测试4种颜色3.2 disp_layer_cfg 命令3.3 disp_mem 对显示内存写入内…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

如何远程连接SQLServer数据库

如何远程连接SQLServer数据库 准备工作 1.打开 选中如下的连接方式 连接成功后就会出出现 2.连接成功后&#xff1a;右键设置属性 安全性设置&#xff1a;如下图所示 设置连接属性&#xff1a; 设置完成之后点击完成&#xff01;&#xff01;&#xff01; 3.打开 启动sqlSe…

分布式系统事务一致性解决方案

开篇 在OLTP系统领域&#xff0c;我们在很多业务场景下都会面临事务一致性方面的需求&#xff0c;例如最经典的Bob给Smith转账的案例。传统的企业开发&#xff0c;系统往往是以单体应用形式存在的&#xff0c;也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技…

一、MySQL 数据库设计

一、MySQL 数据库设计 1.1 为什么需要设计数据库 良好的数据库设计 降低应用程序的开发难度具备高效的查询效率具备良好的扩展性 糟糕的数据库设计 出现数据操作异常、修改复杂、数据冗余等问题影响程序的性能&#xff0c;甚至会导致程序崩溃 数据库设计是对数据库中实体以…

利用 Visual Studio 2022 加速虚幻引擎应用开发

自上次官宣对虚幻引擎的支持后&#xff0c;我们的开发团队一直在努力构建新一代的虚幻引擎集成功能。今天&#xff0c;我们很高兴地向你展示我们所开发的一系列用于提升游戏开发效率的各种新特性。在下面的文章中&#xff0c;你将了解如何查看流式日志&#xff0c;查看 Visual …

【redis】数据同步:主从库如何实现数据一致

如果redis实例宕机了&#xff0c;在恢复期间&#xff0c;无法服务新来的数据存取请求。 redis高可靠性&#xff1a; 数据尽量少丢失&#xff08;AOF、RDB&#xff09;服务尽量少中断&#xff08;增加副本冗余量&#xff09;-将一份数据同时保存在多个实例上 redis提供了主从模…

系统分析师高频错题集

软件架构设计---软件架构评估 信息系统评价要素包括&#xff1a;功能、成本、可靠性、可用性、存储容量、效率、响应时间等。不同的应用&#xff0c;首选评价指标是不同的&#xff0c;如银行系统&#xff0c;应该重点考虑系统的可用性和可靠性。 软甲架构设计---软件架构评估 …

android BatteryHistorian使用

android BatteryHistorian使用 Batterystats 工具和 Battery Historian 脚本的基本用法和工作流程Batterystats 是包含在 Android 框架中的一种工具&#xff0c;用于收集设备上的电池数据。您可以使用 adb 将收集的电池数据转储到开发计算机&#xff0c;并创建一份可使用 Batt…

了解Mysql

存储引擎 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 InnoDB和MyISAM的区别 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;。虽然性…

2017百度世界大会 爱奇艺创始人CEO龚宇演讲速记

2017百度世界大会如期而来。&#xff08;好像不对&#xff0c;Robin 说往年都是夏季办&#xff09;那就改成千呼万唤始出来。 以下是爱奇艺创始人CEO龚宇演讲实录&#xff0c;小编全文呈上&#xff0c;请各位查收&#xff1a; 各位来宾&#xff0c;大家好&#xff01; 很高兴今…

深力科本周知识小课堂【分立半导体】晶体管(上)基础知识,微电子人的狂欢

深力科本周知识小课堂【分立半导体】晶体管&#xff08;上&#xff09;基础知识&#xff0c;微电子人的狂欢 今天&#xff0c;东芝深力科电子将为大家说明一下双极晶体管和绝缘栅双极晶体管。 晶体管大致分为三种类型&#xff1a;双极型、场效应型和绝缘栅双极型。 双极晶体管…

Linux下的JavaEE开发(xftp传输安装、wget安装)

目录 一&#xff1a;jdk的安装&#xff08;xftp传输安装&#xff09; 二&#xff1a;Tomcat的安装&#xff08;不需要配置环境变量&#xff09; 三&#xff1a;Idea的安装&#xff08;不需要配置环境变量&#xff09; 四&#xff1a;Mysql的安装&#xff08;wget网络安装&am…

千寻驰观亮相公路行业权威年会,开启2023全国路测第一站

千寻驰观亮相中国公路学会养护与管理养护与管理分会第十二届学术年会2023年3月28日至29日&#xff0c;在中国公路学会养护与管理养护与管理分会第十二届学术年会上&#xff0c;千寻位置面向行业全面展示了千寻驰观-道路智能巡检系统“车道级”目标位置估计、像素级的面积计算、…

linux系统编程(5)--进程间通信

1.进程间通讯概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的&#xff0c;没有关联&#xff0c;不能在一个进程中直接访问另一个进程的资源。 但是&#xff0c;进程不是孤立的&#xff0c;不同的进程需要进行信息的交互和状态的传递等&#xff0c;…