13. Python的文件操作

閱讀時間約 24 分鐘
raw-image


Hi,大家好。我是茶桁。

在之前的几节课程中,我们学习了Python的数据类型。和市面上大多数的Python教程不同的是,我先为大家介绍完函数之后才开始介绍数据类型,其中原因就是很多数据类型的方法及理解都需要先搞懂函数的基本语法。

在结束了Python数据类型学习之后,我们今天开始进入一个新的篇章。今天,让我们来详细了解一下在Python中如何去进行文件操作。

我们大家都使用过智能手机,电脑,iPad等电子产品。那我们肯定有打开文件的经验,比如说打开一个Word、Excel文档。最基础的操作实际上就两步,分别是1. 打开文件, 2. 关闭文件。

我们要理解的一点是,文件都是放在存储设备中的,这才是我们能打开它的基础。那我们在存储设备中对文件进行打开之后进行的读写操作,实际上就是文件I/O

什么是I/O?I代表Input(输入),O代表Output(输出)。当你打开一个文件的时候,就算你没有对文件进行更改,也依然已经有了I/O操作,毕竟文件只有读取之后,才能显示到你的屏幕上。

那么文件读写到底分了几步呢?让我们引用一下宋丹丹的经典小品中的一段:

问,把大象装进冰箱分几步?

我们就不在这里进行分步讨论了,因为流程步骤实际上是一模一样的:

  1. 打开文件open() : 打开冰箱。
  2. 读取文件read()/ 写入内容write(): 把大象装进冰箱。
  3. 关闭文件close(): 关闭冰箱。

可以说,你在你的设备上做的任何操作都逃不开这几步,区别无非就是你有没有写入内容,从哪里打开的,读取的文件是什么类型的。

那么复杂一点的,就是当你打开一个App的时候,这个App执行某项操作的时候去互联网上的服务器找相应的文件然后到本地之后打开,读取。我们不讨论在打开文件之前的一系列例如下载(这个下载动作有时是主动的,有时是被动的)操作,就只说到本地之后读取文件并展示,就一定包含这三步。

理解到这,可以了。我们接着正式来学习Python如何对文件进行操作。

文件操作

open()

open函数就是用于最初的打开文件的动作,其基本格式为:open(文件路径, 打开方式, [字符集]), 完整的格式为:open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

在大部分时候,我们使用基本格式就足够了。

'''
打开文件 open()
参数1: 文件路径
参数2: 打开的方式
参数3: 字符集
'''

路径,也就是url是一种统一资源定位符。其中包括相对路径绝对路径

相对路径,比如说我们被路人问路,我们就说:这条街往前,前面十字路口就是交道口,然后左转,再走100米左右就到了。

绝对路径, 这个就非常好理解了,北京市西城区鼓楼东大街28号,特别准确了对吧?

这两个路径的描述呢,其实指向的是一个地方。只是一个是针对人所在的位置来告知你怎么走,另外一个是从最上层给到你一个绝对的地址。而电脑里的相对路径和绝对路径也基本就是这么个意思。

我们来看相对路径,主要是使用./../来进行描述,这两个都有一个共同点,就是以当前文件为准。也就是当前文件向我们问路,我们站在当前文件的地方告诉它该怎么走去到达自己的目的地。

举例, 假设我们现在正在编辑index.py这个文件,也就是说,向我们问路的文件是index.py

- project
| - index.py
| - test.txt
| img
| - person.jpg
| - dog.jpg
| - cat.jpg
- data
| - person.csv

这样一个路径关系中:

  1. 当我们需要去访问person.jpg并打开的话,那就是index.py同目录下的img目录里面去寻找person.jpg, 那我们相对路径的写法为./img/person.jpg
  2. 当我们要去找person.csv的时候,由于这个csv是存在于上一层目录的同级目录data内,那我们需要向上去寻找,就是../data/person.csv

这就是./../的区别,一个是当前目录同级内去寻找,一个是向上一级的目录内去寻找。那如果文件存储于上两层目录中呢?那就向上翻两层呗:../../这样,多层的时候,依次类推。

相对路径介绍完了,我们来看看绝对路径

绝对路径的前提是必须找到根目录。在windows中我们其实都熟悉一个东西就是盘符。比如说C:\,不严谨的说,盘符就算是绝对路径的根目录了。那为什么说不严谨的说呢?因为我们输入文件路径的时候可以输入:C:\data\person.csv这样去寻找。但是,盘符之上其实是整个硬盘,我们只是将硬盘虚拟成了不同的盘符用于划分空间而已。

Mac或者Linux中,就是以整个硬盘为准去寻找文件的。比如说/Users/xx/Downloads,就是我们的下载目录。

那我们如果想要打开文件,这两种方式其实都可以,一般来说,为了代码能够适应环境变化,我们都会选择使用相对路径。

说完文件路径,让我们来说说打开方式,我先介绍一个模式,后面咱们再慢慢讲:

w模式: write, 写入

如果文件不存在,创建这个文件; 如果文件存在,则打开这个文件,并且清空文件内容。文件打开后,文件的指针在文件的最前面。什么是指针呢? 可以这么理解,当我们打开一个word文档的时候,我们的光标是不是都在这个文档的最上面?这个光标的位置,就是指针的位置。

write()

write()是用于对文件写入内容来使用的,格式为:文件对象.write(内容)

close()

格式为: 文件对象.close() , 可以关闭打开的文件。

我们需要注意一点,我们在对文件进行操作的时候,一定记得操作完要关闭它。否则,这个文件就会一直存在于内存地址中。

下面,让我们看看在Python中如何打开操作一个文件的。

以下所有的操作演示都会在../Python/13.ipynb中进行编写,所以我们的操作路径都会以这个文件为准。

让我们现在当前文件的中创建一个文件夹data,然后在其中放入一个文件13-1.txt,我们说要做的事情,就是打开这个文件,然后将我们之前写的内容复制一部分写入到这个txt文件中去,路径关系如下图:

raw-image


# 打开13-1 并且写入内容
fp = open('./data/13-1.txt', 'w')
print(fp, type(fp))
fp.write('相对路径: 比如说我们被路人问路,我们就说:这条街往前,前面十字路口就是交道口,然后左转,再走100米左右就到了。\n 绝对路径: 这个就非常好理解了,北京市西城区鼓楼东大街28号,特别准确了对吧?')
fp.close()

---
<_io.TextIOWrapper name='./data/13-1.txt' mode='w' encoding='UTF-8'> <class '_io.TextIOWrapper'>

打印区打印的内容,实际上是我们print函数执行的结果,可以看到,我们打印fp这个变量的时候,显示的是<_io.TextIOWrapper name='./data/13-1.txt' mode='w' encoding='UTF-8'>, 其类型是<class '_io.TextIOWrapper'>

这些先放在一边,让我们看看文件到底写入没有:

raw-image

写入是写入了,可是这是什么鬼?

啊,差点忘了,整个open()方法内后面还有一个参数encoding=, 这个参数是告诉我们这个文件以什么字符集去打开。默认的就是UTF-8,显然,我们保存的这个文件并不是,所以最终导致了乱码。

让我们修改一下代码,在open()内添加一下encoding,其他不变:

fp = open('./data/13-1.txt', 'w', encoding='GBK')
...

---
<_io.TextIOWrapper name='./data/13-1.txt' mode='w' encoding='GBK'> <class '_io.TextIOWrapper'>

可以看到,打印出来的fp最后的encoding值已经发生了变化。让我们再去看看文件如何了:

raw-image


果然没问题,内容能够正确显示而不会乱码了,我们注意到下方文件字符集确实为GBK

关于字符集编码的问题这里有疑问的,自己回过头再去把我之前讲的课程好好翻腾一下,复习一下。

整段代码中,我们引用了刚才介绍的三个文件操作的函数: open()write()close()

在简单了解了文件的操作步骤之后,我们接下来再继续看文件操作中另外一个比较重要的函数: read()

read()

在对文件进行操作的时候,一定要记得流程一定是打开open在最前面,close关闭在最后面。至于中间你是要读取,写入还是别的什么操作,那都不违反文件操作的整个流程。

所以在下面一段代码里,我们可以尝试把之前的write()替换为read(),顺便可以学一下如何在代码中看看我们刚修改过的文件:

fp = open('./data/13-1.txt', 'r', encoding='GBK')
res = fp.read()
fp.close()

print(res)

---
相对路径: 比如说我们被路人问路,我们就说:这条街往前,前面十字路口就是交道口,然后左转,再走100米左右就到了。
绝对路径: 这个就非常好理解了,北京市西城区鼓楼东大街28号,特别准确了对吧?

可以看到,我们讲刚才写入的内容在打印区完整的打印了出来。

不知道小伙伴们有没有注意到,在使用open()函数的时候,其中的第二个参数「打开方式」这次发生了变化,改成了‘r’, 这中打开模式就是专门用于读取文件的,它在打开文件的时候,不会想‘w’的打开方式一样清空文件。

比如,我们讲之前的代码中换一下打开方式来试试:

fp = open('./data/13-1.txt', 'w', encoding='GBK')
res = fp.read()
fp.close()

print(res)

---
UnsupportedOperation: not readable

报错了,提示不可读。

我们再去直接打开13-1.txt的时候可以看到。文件内空空如也,之前写入的内容全都被清空了。

到这里为止,大家了解了文件操作的四个基本操作函数,在这里我可以教大家一个文件操作中的一些高级技巧,比如,我们可以使用with...as...来进行操作:

'''
with open(文件路径, 打开模式) as 变量:
变量.操作()
'''

让我们直接来看示例:

with open('./data/13-1.txt', 'r+', encoding='GBK') as fp:
res = fp.read()
print(res)

---
相对路径: 比如说我们被路人问路,我们就说:这条街往前,前面十字路口就是交道口,然后左转,再走100米左右就到了。
绝对路径: 这个就非常好理解了,北京市西城区鼓楼东大街28号,特别准确了对吧?

这样,我们也就直接完成了之前读取的操作。

read函数内是有参数的:read(count), 接收的值为整型,这里是描述当前我要读取几个字节长度:

with open('./data/13-1.txt', 'r', encoding='GBK') as fp:
res = fp.read(5)
print(res)

---
相对路径:

有的小伙伴看到我写到这可能就有疑问了,我为什么没有写close()函数,那是不是说,现在这个文件都还一直存在内容地址中。

其实并不是如此。在使用with...as...这个方式去打开一个文件的之后,在整个代码结束的时候会自动对当前打开的文件一遍执行close()函数。

好,让我接着继续:

with open('./data/13-1.txt', 'r+', encoding='GBK') as fp:
res = fp.read()
print(res)
fp.write(res)

---
相对路径: 比如说我们被路人问路,我们就说:这条街往前,前面十字路口就是交道口,然后左转,再走100米左右就到了。
绝对路径: 这个就非常好理解了,北京市西城区鼓楼东大街28号,特别准确了对吧?

打印区并未发生变化,原因就是我们的写入操作是在print之后进行的,我们直接打开文件来看看:

raw-image

可以看到,内容确实被写入文件中了。注意我打标记的地方,并没有换行对吧,也就是说,我们在做写入的时候,指针是标记在这个位置的,然后继续往后写入。

另外整个代码中需要注意的就是打开模式了,我们之前已经用过的打开模式有‘w’和``'r', 现在我们用了‘r+’的模式,那么r+呢就是既可以读,也可以写入。并且,不会一开始就清空文件的内容。

对应‘w’的清空模式,就是‘w+’, 虽然‘w+’也是可读可写的模式,但是它和‘w’的模式一致,打开文件的时候直接清空整个文件的内容。

除了这四个模式之外,还有'a'和‘'a+’模式,是追加写的模式,这种模式的特点是打开文件的时候,指针是放在文件最末尾的。所以这种模式使用read()的时候,是读不到任何内容的。

以为到这里就结束了吗?太单纯了,整个文件操作的打开模式中,还有一个‘x+’的模式,这种模式我们可以称它为异或,什么意思呢?就是这种模式只会新建文件来执行后续操作,否则就会报错:

with open('./data/13-1.txt', 'x+', encoding='GBK') as fp:
print(fp.read())

---
FileExistsError: [Errno 17] File exists: './data/13-1.txt'

提示文件错误:文件存在。

如果我们操作的是一个本来不存在的文件,才可以正常的往下进行:

with open('./data/13-x+.txt', 'x+', encoding='UTF-8') as fp:
res = fp.read()
print(res)
fp.write('这里是"x+"模式下新加入的内容。')

with open('./data/13-x+.txt', 'r+', encoding='UTF-8') as fp:
res = fp.read()
print(res)

---
这里是"x+"模式下新加入的内容。

我们在用‘x+’模式打开一个文件的时候,它已经新建了这个文件,我们可以看到读取之后并未读取到任何内容,因为这个文件内还是空的。在进行写入操作之后,我们在下面再一次读取这个文件,可以看到内容已经被写入了。

详谈「打开模式」

其实mode这个参数并不只是我们演示的这么点内容,mode这个参数是接收两种值的,一个是刚才我们一直在讲的读写模式, 而另外一个则是文件格式

读写模式

读写模式的参数主要有四种, 分别是rw,a以及一个特殊+, 其中rwa决定了当前文件默认是只读还是只写,还有就是指针位置。+是和前面三个结合使用的,无法单独使用,其主要作用是使的文件读写兼备。

文件格式

文件格式主要是以两种格式为准,一种是普通的文本文件,一种是二进制格式文件。不要以为二进制格式没什么大不了,我们一般谈到非文本文件都属于二进制格式文件,比如:图片。

这两个格式控制字符一个是t: 以文本格式打开文件(默认值), 一个是b: 以二进制格式打开文件。

一般来说,我们大部分时候都不会单独使用某一个参数吗,而是结合着一起使用。比如:

r+, 打开一个文件用于读写,文件存在就打开,文件不存在则报错。指针在文件头。这种模式要注意,因为指针在文件头,所以新写入的内容会在原内容之前。

w+, 打开一个文件用于读写,文件存在就打开,并且会清空所有内容后进入编辑模式,如果文件不存在则会创建一个新文件。虽然指针也在文件头,但是因为它霸道的清空属性,所以也不存在新写入的内容会在原内容之前了。

a+, 以追加的模式打开一个文件用于读写,如果文件存在就打开,如果文件不存在,则会创建一个新文件用于读写。这种模式下和w+不同的地方在于它会将指针放在文件末尾,写入的时候是从文件尾部开始写。并且,它没那么霸道,要清空原内容才可以。

其他的模式就是在打开文件格式和读写模式的组合,一般我们不写是因为大部分时候我们操作的都是文本文件进行操作,而如果我们需要用二进制格式打开文件的时候,就不能使用默认的t而是b了,一般我们会是这样进行组合:rbrb+wbwb+abab+

当然,最后就是我们刚才用到的x+, 其实它也是一种组合形式,原本应该是x, 这种模式是在Python3中新添加的,它在文件不存在的时候它会创建一个新文件用于写入。如果这个文件存在,就会报错。

那么有了x这个参数之后,我们以前为了避免误操作覆盖原文件,那么我们会先去判断一个文件是否存在,然后再去执行后续的写入操作。可是使用x就没那么麻烦了,可以直接操作写入,反正文件如果存在会返回错误。

关于指针位置

那么我们在使用了r+之后,有没有什么办法可以让我们不在原内容之前写入内容而是从后开始写呢?

答案是有办法,也就是调整指针位置,调整完毕之后再进行写入操作就可以了。

调整指针的方法为seek(offset[, whence])。我们来看一个对比:

# 创建一个新文件
with open('./data/13-2.txt', 'w', encoding='UTF-8') as fp:
fp.write('1. Hello Python.\n2. Hello C++. \n3. Hello Ruby.')

# 正常状态下
with open('./data/13-2.txt', 'r', encoding='UTF-8') as fp:
print(fp.readline())
print(fp.readline())
print('--------------')

# 设置指针重新偏移到头部
with open('./data/13-2.txt', 'r', encoding='UTF-8') as fp:
print(fp.readline())
fp.seek(0, 0)
print(fp.readline())

---
1. Hello Python.

2. Hello C++.

------------
1. Hello Python.

1. Hello Python.

在最开始,我们重新创建了一个文件,然后写了三行文字。分别是:

1. Hello Python.
2. Hello C++.
3. Hello Ruby.

然后我们开始用不同的方法进行读取,每次仅读取一行。

正常状态下,readline()这个方法是顺序往下执行的,第一次执行的时候读取的是第一行,第二次执行的时候就是读取的第二行。这种方式是不是感觉有些熟悉,像不像迭代器?

回过头来,我们再来看两次执行的结果,不同的是,第二次我在两个readline()方法中间加入了一段fp.seek(0,0)来将指针再次调整到头部,别着急,我们一会讲为什么这样写,先来看看结果。

因为有了fp.seek(0,0)的存在,第二次执行和第一次完全不同。第一段内容被读取了两次。这就是seek()的作用,讲指针又调整到了文件头部。

现在,让我们来说说seek()内参数的含义,完整的写法是:seek(offset[, whence]),其中offset是偏移量,而whence是从哪开始。whence就只有三个值, 0, 1, 2, 0就表示是从头部开始偏移,1就表示从当前位置开始偏移,2就代表从文件末尾开始偏移。而我们写的(0,0)意思就是从文件头部开始偏移,偏移量为0。

再来看一段代码:

# 设置指针重新偏移到头部
with open('./data/13-2.txt', 'r+', encoding='UTF-8') as fp:
fp.seek(0, 2)
fp.write('这里是使用r+添加到末尾的内容')

with open('./data/13-2.txt', 'r', encoding='UTF-8') as fp:
print(fp.read())

---
1. Hello Python.
2. Hello C++.
3. Hello Ruby.这里是使用r+添加到末尾的内容

通过前面的学习我们知道,r+在打开文件之后,指针是放在头部的,但是我们这里用seek(0,2)将指针调整到了最末尾,并且写入了一段文字。

学到这里,文件的基本操作也就差不多学完了,让我们来分别总结一下:

相关函数

open(), 打开文件, 格式:open(file_name [, access_mode][, buffering])

read(), 读取内容, 格式:fileObject.read([count])

不设置count是从当前位置读取到文件末尾,设置count这是读取指定长度的字符。

  • readline(), 读取一行

不设置count是从当前位置读取到这一行末尾,设置count这是读取这一行中指定长度的字符。

  • readlines(), 读取所有行

不设置参数是表示读取所有汗,每一行作为一个参数,返回了一个列表。设置count是按照行进行读取,可以设置读取的字节数,设置的字节数不足一行按一行来读取。

  • write(),写入内容, 格式:fileObject.write(string)
  • writelines(), 写入容器类型数据:

写入容器类数据的时候要注意,这个容器类数据必须是可更新的类型。

  • seek(), 设置文件指针的偏移, 格式: seek(offset[, whence])
  • close(), 关闭文件

当然,除了这几个之外,文件还有很多其他的函数,但是目前我们用这些进行读写操作就足够了。

打开模式(图)

关于打开模式, 我之前写的那些内容看懂理解了,其实也就不需要现在这两张图了,可是我担心的是有些小伙伴理解不了,那有了下面的图,至少操作的时候可以参考:

raw-image


总结一下最常用的六种模式:

raw-image

下面这张经典的流程图可以告诉你在什么时候需要用什么:

raw-image


结尾与预告

文件的基本操作就介绍到这里了,大家下课之后记得要去多多的熟悉和练习。

那么下一节课呢,我们会根据我们这之前所讲的所有内容,尝试做一个小demo, 实现一个简单的注册和登录功能。

这里先介绍一下这个demo:

实现功能:
1. 用户输入用户名和密码以及确认密码
2. 用户名不能重复
3. 两次密码要一致
4. 用户用已经注册的账户登录
5. 密码如果错误3次,锁定,无法再登录。

好了,小伙伴们,咱们下节课再见。

avatar-img
9會員
62內容數
从基础开始,再到Python,然后是CV、BI、NLP等相关技术。从头到尾详细的教授一边人工智能。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
茶桁的沙龍 的其他內容
Hi, 大家好。我是茶桁 通过最近几节课的内容,我们已经了解到了大部分的容器类数据的特性和应用,今天这一节课是容器类数据的最后一部分。让我们今天来详细了解一下「集合」。
Hi,大家好。我是茶桁。 关于Python的数据类型,我们已经详细讲解了三种,字符串,列表和元组。那么今天,我们再来讲一种:字典。 字典也是一种数据的集合,由健值对组成的数据集合,字典中的键是不能重复的。 字典中的键必须是不可变的数据类型,常用的键主要是:字符串,整型... 实际上,在之前字
Hi,大家好。我是茶桁。 之前两节分别介绍了字符串和列表,今天,我们来讲讲另外一个常用到的数据类型:元组。 元组和列表很像,两者都是一组有序的数据的组合。但是也有很多不同点,比如元组内的元素一旦定义了就不可以再修改,因此元组称为不可变数据类型。 元组定义 元组的定义方式包括以下要点: 定义
Hi,大家好。我是茶桁。 最近几节课,我们都是在详细讲解Python内的数据类型,上一节课我们详细了解了字符串,这节课,让我们来详解一下列表。 首先,我们先有一个大的概念,列表,其实就是一组有序的数据组合;另外,列表中的数据是可以被修改的。也就是说,列表是一个可变序列类型。 列表定义 如何在
Hi, 大家好。我是茶桁。 前几节课中我们学习了函数,那么这节课开始,我们花几节课返过头来详细的学习一下Python内的数据类型。第一节课,让我们先从字符串开始: 回顾字符串的定义方式 了解转义字符 字符串格式化的方法 字符串相关函数 字符串的定义方式 单引号定义字符串 ‘ ’ 双引
Hi,大家好。我是茶桁。 讲完了基础函数和高阶函数之后,我们这一节来研究下Python的内置函数,看看Python在安装完毕之后的解释器里,到底都预先给我们提供好了哪些可用的函数。 本节内容着重介绍一些常用函数,并且会做一些应用上的示例。当然,对于Python的内置函数,我们还可以查询官方文档,
Hi, 大家好。我是茶桁 通过最近几节课的内容,我们已经了解到了大部分的容器类数据的特性和应用,今天这一节课是容器类数据的最后一部分。让我们今天来详细了解一下「集合」。
Hi,大家好。我是茶桁。 关于Python的数据类型,我们已经详细讲解了三种,字符串,列表和元组。那么今天,我们再来讲一种:字典。 字典也是一种数据的集合,由健值对组成的数据集合,字典中的键是不能重复的。 字典中的键必须是不可变的数据类型,常用的键主要是:字符串,整型... 实际上,在之前字
Hi,大家好。我是茶桁。 之前两节分别介绍了字符串和列表,今天,我们来讲讲另外一个常用到的数据类型:元组。 元组和列表很像,两者都是一组有序的数据的组合。但是也有很多不同点,比如元组内的元素一旦定义了就不可以再修改,因此元组称为不可变数据类型。 元组定义 元组的定义方式包括以下要点: 定义
Hi,大家好。我是茶桁。 最近几节课,我们都是在详细讲解Python内的数据类型,上一节课我们详细了解了字符串,这节课,让我们来详解一下列表。 首先,我们先有一个大的概念,列表,其实就是一组有序的数据组合;另外,列表中的数据是可以被修改的。也就是说,列表是一个可变序列类型。 列表定义 如何在
Hi, 大家好。我是茶桁。 前几节课中我们学习了函数,那么这节课开始,我们花几节课返过头来详细的学习一下Python内的数据类型。第一节课,让我们先从字符串开始: 回顾字符串的定义方式 了解转义字符 字符串格式化的方法 字符串相关函数 字符串的定义方式 单引号定义字符串 ‘ ’ 双引
Hi,大家好。我是茶桁。 讲完了基础函数和高阶函数之后,我们这一节来研究下Python的内置函数,看看Python在安装完毕之后的解释器里,到底都预先给我们提供好了哪些可用的函数。 本节内容着重介绍一些常用函数,并且会做一些应用上的示例。当然,对于Python的内置函数,我们还可以查询官方文档,
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天想跟大家分享一個用python做的小遊戲,叫做1A2B,這個遊戲的規則很簡單,就是電腦會隨機產生一個四位數的數字,然後玩家要猜這個數字是什麼,每次猜完,電腦會給出幾A幾B的提示,A表示位置和數字都對,B表示數字對但位置不對;例如,如果電腦產生的數字是1234,玩家猜5678,那麼電腦會回
Thumbnail
在 Python 中,List、Set、Tuple 和 Dictionary 都是常用的資料結構,它們各自具有不同的特性和用途,在本篇學習筆記中,我們將比較這四種資料結構,介紹它們的特點、用法以及適用的場景,幫助你更好地理解它們的差異和選擇適當的資料結構。
使用Python和OpenCV模組來讀取視訊鏡頭
Thumbnail
上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料?」供各位參考囉! 這一篇章會以捕魚的四大步驟進行比
Thumbnail
儲存格的存取和變數的存取一樣直覺與簡單,但是要注意儲存格的值和儲存格物件是兩個不同的東東;其中,儲存格的值是儲存格物件的一個屬性(value)。工作表ws中儲存格A4可以用ws['A4']這樣的方式表示,也可以用ws.cell(row = 4, column = 2)表示,或簡單地用ws.cell(
Thumbnail
每個人都有自己檢視個股好壞的方式,但總是希望每次在查詢時,如果能一鍵就檢視完成那該有多好。今天我們就來學習如何製作一份地雷股檢視圖,學會後就能夠如法炮製,製作自己的一鍵檢視清單,不用再上網依靠其他網站手動檢查,可以省下一大段時間,又能及時了解要投資的個股好壞,以便能適時做出買賣決策
Thumbnail
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
Thumbnail
當我們查字典時,會先找到想查詢的單字在字典裡的位置,才能在那個位置找到單字的定義;在Python中,也有一個類似的資料結構稱作字典,字典的鍵(key)就對應到我們要查詢的單字,字典的值(value)則是該單字的定義。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天想跟大家分享一個用python做的小遊戲,叫做1A2B,這個遊戲的規則很簡單,就是電腦會隨機產生一個四位數的數字,然後玩家要猜這個數字是什麼,每次猜完,電腦會給出幾A幾B的提示,A表示位置和數字都對,B表示數字對但位置不對;例如,如果電腦產生的數字是1234,玩家猜5678,那麼電腦會回
Thumbnail
在 Python 中,List、Set、Tuple 和 Dictionary 都是常用的資料結構,它們各自具有不同的特性和用途,在本篇學習筆記中,我們將比較這四種資料結構,介紹它們的特點、用法以及適用的場景,幫助你更好地理解它們的差異和選擇適當的資料結構。
使用Python和OpenCV模組來讀取視訊鏡頭
Thumbnail
上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料?」供各位參考囉! 這一篇章會以捕魚的四大步驟進行比
Thumbnail
儲存格的存取和變數的存取一樣直覺與簡單,但是要注意儲存格的值和儲存格物件是兩個不同的東東;其中,儲存格的值是儲存格物件的一個屬性(value)。工作表ws中儲存格A4可以用ws['A4']這樣的方式表示,也可以用ws.cell(row = 4, column = 2)表示,或簡單地用ws.cell(
Thumbnail
每個人都有自己檢視個股好壞的方式,但總是希望每次在查詢時,如果能一鍵就檢視完成那該有多好。今天我們就來學習如何製作一份地雷股檢視圖,學會後就能夠如法炮製,製作自己的一鍵檢視清單,不用再上網依靠其他網站手動檢查,可以省下一大段時間,又能及時了解要投資的個股好壞,以便能適時做出買賣決策
Thumbnail
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
使用pandas,透過TWStock_2的資料,計算下列三種常用的技術指標 1. 移動平均線 2. 指數移動平均線 3. MACD 首先連接資料庫,然後我們只取"成交股數 , 開盤價 , 最高價 , 最低價 , 收盤價" 這5個columns代入新的tsmc( 名稱 ) code如下 參考連結如下
Thumbnail
當我們查字典時,會先找到想查詢的單字在字典裡的位置,才能在那個位置找到單字的定義;在Python中,也有一個類似的資料結構稱作字典,字典的鍵(key)就對應到我們要查詢的單字,字典的值(value)則是該單字的定義。