挑战30天学完Python:Day19 文件处理

2024-02-23 23:12

本文主要是介绍挑战30天学完Python:Day19 文件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📘 Day 19

🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点知识,但又没有系统学习的使用者。总之如果你想提升自己的Python技能,欢迎加入《挑战30天学完Python》

  • 📘 Day 19
    • 文件处理
      • 读®模式
      • 文件写入和更新
      • 删除文件
    • 文件类型
      • .txt
      • .json
      • JSON转字典
      • 字典转JSON
      • 保存为JSON文件
      • .csv
      • .xlsx
      • .xml
    • 💻 第19天练习
      • 练习1级
      • 练习2级
      • 练习3级

📘 Day 19

文件处理

此前我们已经见过了不同的Python数据类型。通常也会将我们的数据存储在不同的格式的文件中。在这章节中我们将学习如何处理这些不同的类型的文件(.txt, .json, .xml, .csv, .tsv, .excel)。首先,让我们从最熟悉的txt类型文件开始。

文件处理是程序中很重要的部分,它允许我们进行创建、读取、更新和删除。在Python中处理文件数据使用的是 open 内置方法。

# 语法形式
open('filename', mode) # 模式mode(r, a, w, x, t,b)  表示 读, 写, 更新
  • “r” - 英文Read表示读 - 默认值。以读的模式打开一个文件,如果文件不存在它将返回一个错误。Opens a file for reading, it returns an error if the file does not exist
  • “a” - 英文Append表示追加 - 以追加模式打开文件,如果文件不存在则会自动创建。Opens a file for appending, creates the file if it does not exist
  • “w” - 英文Write表示写 - 以写的模式打开一个文件,如果文件不存在则创建。Opens a file for writing, creates the file if it does not exist
  • “x” - 英文Create表示创建 - Creates the specified file, returns an error if the file exists
  • “t” - 英文Text表示文本 - Default value. Text mode
  • “b” - 英文Binary表示字节 - Binary mode (e.g. images)

读®模式

方法 open 默认模式是只读模式,因此我们可以不需要特别的指定mode= ‘r’ 或 ‘rt’。注意,我已经创建好了一个文件名为 “reading_file_example.txt” 的文件在项目的files目录下。让我们来看看如何读取它。

f = open('./files/reading_file_example.txt')
print(f) # <_io.TextIOWrapper name='./files/reading_file_example.txt' mode='r' encoding='cp936'>>

正如你在例子中看到的,我通过open打开一个文件,并打印了一些加载文件后的一些信息。其中读取文件内容会有几种方法:read(), readline, readlines。关闭文件使用 close() 方法。

  • read():将整个文件内容以字符字符串的形式读取。其中如果我们想限制读取的字符,我们可以给定一个整数类型值 read(number)
f = open('./files/reading_file_example.txt')
txt = f.read()
print(type(txt))
print(txt)
f.close()
# 读取文件全部内容的输出
<class 'str'>
This is an example to show how to open a file and read.
This is the second line of the text.I love python

让我们指定数量字符读取,比如从文件中读取10个字符。

f = open('./files/reading_file_example.txt')
txt = f.read(10)
print(type(txt))
print(txt)
f.close()
# 指定读取数量输出
<class 'str'>
This is an
  • readline(): 读取一行,当第一调用的时候默认为第一行,再次读取依次读取下一行。
f = open('./files/reading_file_example.txt')
line = f.readline()
print(type(line))
print(line)  # 第一行print(f.readline())  # 第二行
print(f.readline())  # 因为文件中只用两行所以当尝试第三次readline时候返回是空字符串f.close()
  • readlines(): 按行的形式读取所有文本,并且返回一个字符行列表。
f = open('./files/reading_file_example.txt')
lines = f.readlines()
print(type(lines))
print(lines)
f.close()
# readlines测试输出
<class 'list'>
['This is an example to show how to open a file and read.\n', 'This is the second line of the text.I love python']

还有另外一种列表行读取文本的方式是使用 splitlines():

f = open('./files/reading_file_example.txt')
lines = f.read().splitlines()
print(type(lines))
print(lines)
f.close()
# splitlines 输出
<class 'list'>
['This is an example to show how to open a file and read.', 'This is the second line of the text.']
# 两种方式大家可以注意下返回的行列表有什么区别?是的第二种方式不包含 \n 换行符。

当打开一个文件,使用完的时候必须关闭它。其实有一种更高级的方式处理它。我们可以使用 with ,此方式可以自己关闭文件使用。看下一下方法应用的例子:

with open('./files/reading_file_example.txt') as f:lines = f.read().splitlines()print(type(lines))print(lines)
# 实际输出
<class 'list'>
['This is an example to show how to open a file and read.', 'This is the second line of the text.']

文件写入和更新

如果想向一个已经存在文件写入内容,我们必须在使用 open() 方法时候添加一个参数模式:

  • “a” - append 追加 - 将在文件默认追加内容,如果文件不存在将自动创建一个新的文件。
  • “w” - write 写 - 覆盖模式写入内容,如果文件不存在则会创建。

接下来让我们将一些文本添加已经读取的文件中:

with open('./files/reading_file_example.txt','a') as f:f.write('This text has to be appended at the end')

用文本编辑器打开 reading_file_example.txt 看是否将内容写入到了文件末尾。

with open('./files/writing_file_example.txt',mode='w', encoding="utf-8") as f:f.write('写入文件测试,其中还需要指定字符编码,否则中文会乱码。')

删除文件

在之前的篇幅中,我们知道了怎么通过 os 创建一个目录或者文件。现在,我我们看看如何通过它删除一个文件。

import os
os.remove('./files/example.txt')

如果删除的文件不存在,它会返回一个错误,因此一个好的编程应该加一个判断,像这样:

import os
if os.path.exists('./files/example.txt'):os.remove('./files/example.txt')
else:print('删除的文件不存在')

文件类型

.txt

带有txt扩展名的文件是最常见的一种数据格式文件,这部分我们已经在上边的一节中讲过了。让我们接下来看一个 JSON 文件。

.json

JSON代表JavaScript对象表示法。实际上,它是一个字符串化的JavaScript对象或Python字典。

Example:

# 字典
person_dct= {"name":"Asabeneh","country":"Finland","city":"Helsinki","skills":["JavaScrip", "React","Python"]
}# JSON: 一个字典格式的字符串
person_json = "{'name': 'Asabeneh', 'country': 'Finland', 'city': 'Helsinki', 'skills': ['JavaScrip', 'React', 'Python']}"# 我们使用三个引号表示多行字符串,让它更具有可读性
person_json = '''{"name":"Asabeneh","country":"Finland","city":"Helsinki","skills":["JavaScrip", "React","Python"]
}'''

JSON转字典

将JSON转成字典,首先我们需要导入 json 模块,然后使用 loads 方法。

import json
# JSON
person_json = '''{"name": "MegaQi","country": "China","city": "ShangHai","skills": ["JavaScrip", "React", "Python"]
}'''
# 接下来 json 转 dict 
person_dct = json.loads(person_json)
print(type(person_dct))
print(person_dct)
print(person_dct['name'])

预期输出

<class 'dict'>
{'name': 'MegaQi', 'country': 'China', 'city': 'ShangHai', 'skills': ['JavaScrip', 'React', 'Python']}
MegaQi

字典转JSON

反过来,如果想将字典转成json类型,我们需要使用 json 模块中的 dumps 方法。

import json
# python 字典
person = {"name": "MegaQi","country": "China","city": "ShangHai","skills": ["JavaScrip", "React", "Python"]
}# 转成json
person_json = json.dumps(person, indent=4) # indent could be 2, 4, 8. It beautifies the json
print(type(person_json))
print(person_json)

预期输出

# 需要注意的是,当你打印json的时候,它并没有引号。
# JSON并不是一种特殊类型, 实际上它在python中就是字符串.
<class 'str'>
{"name": "MegaQi","country": "China","city": "ShangHai","skills": ["JavaScrip","React","Python"]
}

保存为JSON文件

我们也可以将数据保存为json文件。对于编写json文件,我们使用 json.dump() 方法,它可以接受字典,输出到文件,ensure_ascii和缩进。

import json
person = {"name": "Asabeneh","country": "Finland","city": "Helsinki","skills": ["JavaScrip", "React", "Python"]
}
with open('./files/json_example.json', 'w', encoding='utf-8') as f:json.dump(person, f, ensure_ascii=False, indent=4)

注意:想输出真正的中文需要指定 ensure_ascii=False,因为json.dumps 序列化时对中文默认使用的ascii编码

print(json.dumps('{"language":"中文"}'))   # "{\"language\":\"\u4e2d\u6587\"}"
print(json.dumps('{"language":"中文"}', ensure_ascii=False))  # "{\"language\":\"中文\"}"

在上面的代码中,我们使用了编码和缩进让json文件易于阅读。

.csv

CSV代表逗号分隔的值。CSV是一种简单的文件格式,用于存储表格数据,如电子表格或数据库。CSV是数据科学中非常常见的数据格式。

例子数据:

"name","country","city","skills"
"Asabeneh","Finland","Helsinki","JavaScript"

例子演示
这里我们借助csv模块来读取csv文件

import csv
with open('./files/csv_example.csv') as f:csv_reader = csv.reader(f, delimiter=',') line_count = 0for row in csv_reader:if line_count == 0:print(f'Column names are :{", ".join(row)}')line_count += 1else:print(f'\t{row[0]} is a teachers. He lives in {row[1]}, {row[2]}.')line_count += 1print(f'Number of lines:  {line_count}')

执行代码输出:

Column names are :name, country, city, skillsAsabeneh is a teacher. He lives in Finland, Helsinki.
Number of lines:  2

.xlsx

如果要读取excel文件,我们需要安装 xlrd 包。可以通过终端 pip install xlrd 进行安装,至于pip包管理的更多使用,我们将在下一篇中覆盖。

import xlrd  # xlsx格式需要用openpyxl库
excel_book = xlrd.open_workbook('sample.xls)
print(excel_book.nsheets)
print(excel_book.sheet_names)

.xml

XML是另一种看起来像HTML的结构化数据格式。在XML中,标记不是预先定义的。第一行是一个XML声明。person标记是XML的根,并且有性别属性。
XML is another structured data format which looks like HTML. In XML the tags are not predefined. The first line is an XML declaration. The person tag is the root of the XML. The person has a gender attribute.

XML文件数据

<?xml version="1.0"?>
<person gender=""><name>MegaQi</name><country>China</country><city>ShangHai</city><skills><skill>JavaScrip</skill><skill>React</skill><skill>Python</skill></skills>
</person>

关于xml更多的操作请自行按需需求,这里只做个简单演示。

import xml.etree.ElementTree as ET
tree = ET.parse('./files/xml_example.xml')
root = tree.getroot()
print('Root tag:', root.tag)
print('Attribute:', root.attrib)
for child in root:print('field: ', child.tag)

代码执行后输出:

Root tag: person
Attribute: {'gender': '男'}
field:  name
field:  country
field:  city
field:  skills

🌕 你取得了很大的进步。保持这样的势头,加油加油加油!下面让我们来做一些练习吧。

💻 第19天练习

练习1级

  1. 写一个给定参数文件和个数的方法,然后统计文件文本单词和数量,最后按照指定个数返回。练习用的所有文件在项目源码 data 目录下。
  • a) 读取 obama_speech.txt 文件,进行方法调用
  • b) 打开 michelle_obama_speech.txt 文件,进行方法调用
  • c) 读取 donald_speech.txt 文件,进行方法调用
  • d) 打开 melina_trump_speech.txt,进行方法调用
  1. 从data目录中读取 countries_data.json 文件,并且创建一个方法,实现返回指定个数口最多的国家。

练习2级

  1. 从文件email_exchange_big.txt中提取所有电子邮件地址,并作为列表类型。

  2. 找出英语中最常用的单词。将函数名命名为find_most_common_words,它将接受两个参数:一个字符串或一个文件和一个正整数(表示列表个数)。函数将返回一个按降序排列的元组数组。参考输出

  3. 定义方法 find_most_frequent_words 实现文件的中最多单词的统计。分别用如下文件:

  • /data/obama_speech.txt 前10
  • /data/michelle_obama_speech.txt 前10
  • /daa/donald_speech.txt 前10
  • /data/melina_trump_speech.txt 前10
  1. 读取文件/data/hacker_news.csv 文件,然后找出:
  • 统计包含python或Python行数
  • 统计包含JavaScript, javascript or Javascript行数
  • 统计包含Java但不包含JavaScript的行数

🎉 CONGRATULATIONS ! 🎉

<< Day 18 | Day 20 >>

练习参考答案请移步 github项目地址 19_exercise.py

这篇关于挑战30天学完Python:Day19 文件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740243

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还