当前位置: 首页 > news >正文

十四、Python第十四课——文件和异常

(请先看这篇文章:https://blog.csdn.net/GenuineMonster/article/details/104495419)       

如果看完这篇博文,你的问题还是没有解决,那么请关注我的公众号,后台发消息给我吧,当天回复!

 

 

学习文件处理,你将能够快速的分析大量的数据学习错误处理,你将会编写在意外情形下也不崩溃的程序学习异常,你将会管理程序运行时出现的错误你还将学习json,从而能够保存用户数据,以免在程序停止运行后丢失。异常一般来源于破坏程序的恶意企图以及错误数据。举个例子:假设QQ的密码不能包含字母,并且后台程序在判别时也忽略了对字母的识别(没有相关代码)。那么此时,如果你在设置密码时,输了字母,后台程序接受到了,但不知道如何处理这个“不按常理出牌”的密码,此时程序就又可能瘫痪,进而出现错误。“错误及异常”和其他面向对象语言中的一样,就是Java中俗称的“异常抛出机制”。学习这些机制的主要目的是提高程序的适用性、可用性和稳定性。

一、从文件中读取数据

文本文件中可存储的数据量多得难以置信,每当需要分析或修改存储在文件中的信息时,读取文件是很有必要的。要使用文本文件中的信息,首先需要将信息读取到内存中。为此,可以一次性读取文件的全部内容,也可以以每一次的方式逐步读取。

1.1 读取整个文件

我们先来创建一个包含几行文本的文件,名称为pi_digits.txt。内容如下截图:

接下来我们编写代码,读取这个txt文件中的内容,并输出:

with open('pi_digits.txt') as file_object:contents =file_object.read()print(contents)

      要知道,无论我们以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开文件,这样才能访问它

A、函数open()接受一个参数:要打开的文件的名称。Python在当前执行的程序文件所在的目录中查找指定的文件,找到后,执行open()函数,然后返回一个表示文件的对象,并存储在file_object中。

B、关键字with的作用是在不再需要访问文件后将其关闭。在这个过程中,我们只调用了open(),没调用close()。你也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早的调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多地错误。(并非在任何情况下都能轻松确定关闭文件的恰当时机)但我们可以通过使用with,让Python去确定:我们只管打开文件,并在需要时使用它,Python自会在合适地时候自动将其关闭。

C、有了表示pi_digits.txt的文件对象后,我们使用read()方法读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样我们就可以打印全部的内容了。

细心的人已经发现问题了,为什么输出后有这么多空行?这是因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可在print语句中使用rstrip():(我实验了,貌似没什么用啊)

with open('pi_digits.txt') as file_object:contents =file_object.read()print(contents.rstrip())

1.2 文件路径

如果要Python打开不与程序文件位于同一目录中的文件,需要提供文件路径,它让Python到系统的特定位置去查找。文件路径分为绝对路径和相对路径。

A、相对路径:文件所处的位置是相对于当前运行的程序文件所属目录而言的路径,举个例子:(注意使用的是反斜杠)

C:\Users\Jeffery_PC\Desktop\code          # py文件的目录
C:\Users\Jeffery_PC\Desktop\code\123      # 目标文件目录目标文件目录和py文件目录的前面一部分都是一样的,所以省略不写(相当于以py文件的目录为参考)
所以目标文件的相对路径最终表示为:123\pi_digits.txt
我们可以实验一下,看看能否读取文件成功:代码如下:
with open('123\pi_digits.txt') as file_object:contents =file_object.read()print(contents.rstrip())

B、绝对路径:目标文件在计算机中的准确位置就是绝对路径,举个例子:

C:\Users\xxxxxx\Desktop\code\123\pi_digits.txt   # xxxxxx是我的信息,这里隐写了

 在相对路径行不通时,可使用绝对路径。绝对路径通常比相对路径更长,因此将其存储在一个变量中,再将这个变量传递给open()会有所帮助。就目前而言,最简单的做法是:要么将数据文件存储在程序文件所在的目录,要么将其存储在程序文件所在目录下的一个文件夹中。

1.3 逐行读取

读取文件时,常常需要检查其中的每一行:可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。要以每次一行的方式检查文件,可对文件对象使用for循环:

filename = 'pi_digits.txt'
with open(filename) as file_object:for line in file_object:print(line)

这段代码与之前的代码类似,就不解释了。出现空白行的原因是:读取文档每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,一个来自print语句。要消除这些多余的空白行,可在print语句末尾使用rstrip():

filename = 'pi_digits.txt'
with open(filename) as file_object:for line in file_object:print(line.rstrip())

1.4 创建一个包含文件各行内容的列表

使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表里,并在with代码块外使用该列表:你可以立即处理文件的各个部分,也可以推迟到程序后面再处理。

例代码:

filename = 'pi_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()  # 按行读取,并存储在列表中for line in lines:print(line.rstrip())   # 使用for循环来打印每一行的内容

1.5 使用从文件中读取的内容

我们将会读取文件内容,并组成一个新的字符串(组成新的字符串就是我们的“使用”)(将文件读取到内存中后,就可以以任何方式使用这些数据了

filename = 'pi_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()  # 按行读取,并存储在列表中pi_string = ''
for line in lines:pi_string += line.rstrip()print(pi_string)
print(len(pi_string))

看出这个字符串中间还有空格,所以可以使用strip()函数不是rstrip():

filename = 'pi_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()  # 按行读取,并存储在列表中pi_string = ''
for line in lines:pi_string += line.strip()print(pi_string)   # 精确到30位小数的圆周率值
print(len(pi_string))  # 输出字符串的长度

注意读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。

1.6 处理大体量文件

即将要处理的文件内部包含圆周率小数点后一百万位,我们将其打印出来。

filename = 'pi_million_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()  # 按行读取,并存储在列表中pi_string = ''
for line in lines:pi_string += line.strip()print(pi_string[:52] + "...") # 打印到小数点后50位,因为整数和小数点也需要2位
print(len(pi_string))

对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。

1.7 牛刀小试

如果大家关注过北大数院微信公众号,那么对其中一个功能“在圆周率中寻找你的生日”就很熟悉了,这里我们自己也实现一下,检测某个人的生日是否在圆周率的100万当中。逻辑是:将自己的生日字符串化,再检查这个字符串是否包含在pi_string中。

filename = 'pi_million_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()  # 按行读取,并存储在列表中pi_string = ''
for line in lines:pi_string += line.strip()birthday = input ("Enter your birthday, in the form mmddyy:  ") # input()函数需要用户输入信息
if birthday in pi_string:print("Your birthday appears in the first million digits of pi!")
else:print("Your birthday does not appear in the first million digits of pi!")

作者的生日的确出现在Π的前100万位中。

二 将数据写入文件

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在。 

2.1 写入空文件

要将文本写入文件,你在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。接下来以一段具体代码演示一下:

filename = 'programming.txt'
# 如果你写入的文件不存在,open()将自动创建
with open(filename, 'w') as file_object:   # 为open()函数提供两个实参:第一个指明要打开的文件名称# 第二个实参指明:我们将以“写入模式”打开这个文件# ‘r’:读取模式# ‘w’:写入模式# ‘a’:附加模式# ‘r+’:读取写入模式# 如果省略了模式实参,Python将以默认的只读模式打开文件   file_object.write("I love programming!")

 

成功写入!这里需要注意的是:

A、以写入(‘W’)模式打开文件时,千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

B、Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。 

2.2 写入多行

这里只需要注意一点,函数write()不会在你写入的文本末尾自动添加换行符,需要你自己添加。如果还需要其他格式,可以使用“空格”、“制表符”、“空行”来设置文本格式:

filename = 'programming.txt'with open(filename, 'w') as file_object:# 为open()函数提供两个实参:第一个指明要打开的文件名称# 第二个实参指明:我们将以“写入模式”打开这个文件# ‘r’:读取模式# ‘w’:写入模式# ‘a’:附加模式# ‘r+’:读取写入模式# 如果省略了模式实参,Python将以默认的只读模式打开文件file_object.write("I love programming!\n")file_object.write("I love creating new games.\n")

2.3 附加到文件(追加到文件)

如果你要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。如果你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将会为你创建一个空文件。

filename = 'programming.txt'with open(filename, 'a') as file_object:file_object.write("I also love finding meaning in large datasets. \n")file_object.write("I love creating apps that can run in a browser.\n")

 

三 异常

        Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

       异常是使用try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

3.1 处理ZeroDivisionError异常

举个简单的例子:在数学中,0不可以作除数。那如果在Python中出现这样的问题呢?

print(5/0)

同样,程序因为出错了被迫停止,Python指出了出错的地方及错误内容。接下来,我们使用try-except代码块来避免这种情况发生:告诉Python,如果出现了这样的情况该怎么办。

3.2 使用try-except代码块处理异常

在编写代码时,我们可能会预知某些异常的发生,此时可以写一个try-except代码块来处理可能引发的异常。就像英文的意思一样,让Python试一下,如果行就继续;不行的话,那就执行别的代码(except),反正程序别停止了。我们对上述代码进行改写:

try:# 我们将导致错误的代码行print(5/0)放在了一个try代码块中。# 如果try代码块运行起来没问题,那就自动跳过except代码块# 如果try代码块中的代码导致了错误,Python将查找这样的except代码块,# 并运行其中的代码,即其中指定的错误与引发的错误相同print(5/0)
except ZeroDivisionError:print("You can't divide by zero! ")

3.3 使用异常避免崩溃

发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。这种情况经常会出现在要求用户提供输人的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。下面来创建一个只执行除法运算的简单计算器:

print("Give me two numbers, and I'll divide them. ")
print("Enter 'q' to quit. ")while True:first_number = input("\nFirst number: ")if first_number  == 'q':breaksecond_number = input("Second number: ")if second_number == 'q':breakanswer =int(first_number) / int(second_number)print(answer)

当以上这段代码输入除数为0的算式时,问题就出现了:

 这种计算器除法程序可不是我们需要的,如果被怀有恶意的用户遇到,他们会得知很多信息,从而做一些破坏代码的事情。所以我们得使用try-except代码块,不过这里还得加一个“else”,相关的解释是:通过将可能引发错误的代码放在try-except代码块中,可提高这个程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此我们需要将它放到try-except代码块中。这个示例还包含一个else代码块;依赖于try代码块成功执行的代码都应放到else代码块中。

print("Give me two numbers, and I'll divide them. ")
print("Enter 'q' to quit. ")while True:first_number = input("\nFirst number: ")if first_number  == 'q':breaksecond_number = input("Second number: ")if second_number == 'q':break# try代码块里只能包含可能导致错误的代码。try :answer = int(first_number) / int(second_number)except ZeroDivisionError:# 出现错误后的解决代码print("You can't divide by 0. ")# 依赖于try代码块成功执行的代码都放在else代码块中else:print(answer)

try-except-else代码块工作原理小结:Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。except代码块告诉Python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。通过预测可能发生错误的代码,可编写健壮的程序,它们即便面临无效数据或缺少资源,也能继续运行,从而能够抵御无意的用户错误和恶意的攻击。

3.4 处理FileNotFundError异常

使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本不存在。对于所有这些情形,都可以使用try-except代码块以直观的方式进行处理。

filename = 'alice.txt'with open(filename) as f_obj:contents = f_obj.read()

这个错误是函数open()导致的,因此要处理这个错误,必须将try语句放在包含open()的代码之前:

filename = 'alice.txt'
try:with open(filename) as f_obj:contents = f_obj.read()
except FileNotFoundError:msg = "Sorry, the file " + filename + " does not exist. "print(msg)

        

四 处理文本

4.1 分析文本

             我们将会分析整本书的文本文件,下面我们来提取童话“Alice in Wonderland”的文本,并尝试计算它包含多少个单词。我们将使用方法split(),它根据一个字符串创建一个单词列表。下面是对只包含童话名“”Alice in Wonderland“的字符串调用方法split(
)的结果:

title = 'Alice in Wonderland'
print(title.split())

    方法split()以空格为分隔符将字符串拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点。接下来我们使用这个方法,对整篇小说进行处理分析,统计这篇童话大致包含多少个单词:

filename = 'alice.txt'try:with open(filename) as f_obj:contents = f_obj.read()
except FileNotFoundError:msg = "Sorry, the file " + filename + " does not exist. "print(msg)
else:# 计算文件大致包含多少个单词words = contents.split()num_words = len(words)print("The file " + filename + " has about " + str(num_words) + " words")

4.2 使用多个文件

下面多分析几本书:

def count_words(filename):"""计算一个文件大致包含多少个单词"""try:with open(filename) as f_obj:contents = f_obj.read()except FileNotFoundError:msg = "Sorry, the file " + filename + " does not exist. "print(msg)else:# 计算文件大致包含多少个单词words = contents.split()num_words = len(words)print("The file " + filename + "has about " + str(num_words) + " words. ")# siddhartha.txt文件不存在,以此来展示程序的出色。
filenames = ['alice.txt','siddhartha.txt','moby_dict.txt','little_women.txt']
for filename in filenames:count_words(filename)

在这个示例中,使用try-except代码块提供了两个重要的优点:A、避免让用户看到traceback;B、让程序继续分析找到其他文件。

4.3 失败时一声不吭

上面这个例子,在我们找不到对应的文件夹时,Python会提示用户有一个文件没有找到。但并非每次捕获到异常时都需要告诉用户,有时候你希望程序发生异常时一声不吭:

我们可以将“except FileNotFoundError:”中的代码全部删除,改为pass。

def count_words(filename):"""计算一个文件大致包含多少个单词"""try:with open(filename) as f_obj:contents = f_obj.read()except FileNotFoundError:# msg = "Sorry, the file " + filename + " does not exist. "# print(msg)passelse:# 计算文件大致包含多少个单词words = contents.split()num_words = len(words)print("The file " + filename + "has about " + str(num_words) + " words. ")# siddhartha.txt文件不存在,以此来展示程序的出色。
filenames = ['alice.txt','siddhartha.txt','moby_dict.txt','little_women.txt']
for filename in filenames:count_words(filename)

又多了一个关键字“pass”,pass语句还充当了占位符,他提醒你在程序的某个地方什么都没做,并且以后也许要在这里做些什么。

4.4 决定报告哪些错误

       在什么情况下该向用户报告错误?在什么情况下又应该在失败时一声不吭呢? 如果用户知道要分析哪些文件,他们可能希望在有文件没有分析时出现一条消息,将其中的原因告诉他们。如果用户只想看到结果,而并不知道要分析哪些文件,可能就无需在有些文件不存在时告知他们。

       向用户显示他不想看到的信息可能会降低程序的可用性。Python的错误处理结构让你能够细致地控制与用户分亨错误信息的程度,要分享多少信息由你决定。编写得很好且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误,但只要程序依赖于外部因素,如用户输人、存在指定的文件、有网络链接,就有可能出现异常。凭借经验可判断该在程序的什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息。

五 存储数据

       很多程序都要求用户输入某种信息,程序都把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息。一种简单的方式是使用模块json来存储数据。

       模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便格式,很有用,也易于学习。(JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用)

5.1 使用json.dump()和json.load()

我们编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序。

import jsonnumbers = [2,3,5,7,11,13]filename = 'number.json'
# 以写的形式打开文件,使用的是json.dump()
with open(filename,'w') as f_obj:# 把数字写入文件json.dump(numbers,f_obj)# 读取数据,使用的是json.load()
with open(filename) as f_obj:# 为了区别numbers,后面加了下划线和2numbers_2 = json.load(f_obj)# 输出
print(numbers_2)

用记事本打开numbers.json文件,显示如下:

代码先导入了json模块,随后创建了一个数字列表,存储了一些数字。先是将数字存储到了json文件里,后又从json文件中读取出来。其中使用了json.dump()和json.load()方法。

5.2 保存和读取用户生成的数据

对于用户生成的数据,使用json保存将大有好处。因为如果不以某种方式进行存储,等程序停止运行时,用户的信息将会丢失。举个例子来说明:

将用户的姓名存储在json文件里:

# 导入json包
import json
# 需要用户输入一个名字
username = input("What is your name? ")
# 将json文件名存储在filename变量中
filename = 'username.json'
# 以写的方式打开文件,没有就创建一个json文件,并重新命名为f_obj
with open(filename,'w') as f_obj:# 使用json.dump()方法写入输入的名字json.dump(username,f_obj)# 输出提示,表明已将用户输入的名字存储了起来print("We'll remember you when you come back, " + username +"! ")

将json文件的内容再读取出来,比如对这个人进行问候:

# 导入json包
import json
# 将文件名存入filename变量中
filename = 'username.json'
# 读取json文件
with open(filename,'r') as f_obj:username = json.load(f_obj)# 打印问候语print("Welcome back, " + username + "! ")

下面我们将这两个程序合并:

# 导入json包
import json
# 如果以前存储了用户名就加载
# 否则,就提示用户输入用户名并存储
filename = 'username.json'
try:with open(filename) as f_obj:username = json.load(f_obj)
except FileNotFoundError:username = input("What is your name? ")with open(filename,'w') as f_obj:json.dump(username,f_obj)print("We will remember you when you back, " + username + "! ")
else:print("Welcome come back, " + username + "! ")

如果这个文件存在,就将其中的用户名读取到内存中,再执行else代码块,即打印一条欢迎用户回来的消息。用户首次运行这个程序时,文件username.,json不存在,将引发FileNotFoundError异常,因此Python将执行except代码块:提示用户输人其用户名,再使用json.dump()存储该用户名,并打印一句问候语。

5.3 重构

将代码划分为一系列完成具体工作的函数的过程被称为重构。重构让代码更清晰、更易于理解、更容易扩展。接下来,我们对上述问候用户的程序进行重构:

第一次重构:

# 导入json包
import jsondef greet_user():# 考虑到现在使用了一个函数,我们删除注释,取而代之的是一个文档字符串来指出程序是做什么的。"""问候用户,并指出其名字"""filename = "username.json"try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:username = input("What is your name? ")with open(filename, 'w') as f_obj:json.dump(username, f_obj)print("We will remember you when you back, " + username + "! ")else:print("Welcome come back, " + username + "! ")greet_user()

但上述的函数所做的不仅仅是问候用户,还在存储了用户时获取它,而在没有存储用户名时提示用户输入一个。所以我们可以对greet_user()再次重构:

# 导入json包
import jsondef get_stored_username():"""如果存储了用户名,就获取它"""filename = 'username.json'try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:return Noneelse:return usernamedef greet_user():"""问候用户,并指出其名字"""username = get_stored_username()if username:print("Welcome come back, " + username + "! ")else:username = input("What is your name? ")filename = "username.json"with open(filename,'w') as f_obj:json.dump(username,f_obj)print("We will remember you when you back, " + username + "! ")greet_user()

这是该文件不存在时的输入输出:

这是该文件存在时的输出:

上述代码的功能更细化了,我们还可以进一步重构:将greet_user()中的提示用户输入的代码放在一个独立的函数中。

# 导入json包
import jsondef get_stored_username():"""如果存储了用户名,就获取它"""filename = 'username.json'try:with open(filename) as f_obj:username = json.load(f_obj)except FileNotFoundError:return Noneelse:return usernamedef get_new_username():"""提示用户输入用户名"""username = input("What is your name? ")filename = "username.json"with open(filename, 'w') as f_obj:json.dump(username, f_obj)return usernamedef greet_user():"""问候用户,并指出其名字"""username = get_stored_username()if username:print("Welcome come back, " + username + "! ")else:username = get_new_username()print("We will remember you when you back, " + username + "! ")greet_user()

自行体会问候用户程序的三个版本的差异,可以看出代码的功能逐渐具体、清晰,易读性增强。因此,重构是编写代码中必不可少的一环。

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

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

微信小程序趋势及前景,大厂直通车!

最近看到群里看到一个女生,讲述了她从开始选择Android,经过非常努力的学习和挣扎,然而最后面对当前的环境却不得不放弃。看完以后真的非常替她感觉惋惜,如果早几年入行可能结果会比现在好很多,但可惜,这就是…...

设计模式导读助记

各个设计模式的详细介绍都已经完成,但是不经常用总会忘,所以我想用 一句话 总结设计模式,思考模式的真正意图,再用 一点提示 来思考代码如何实现 写在前面 我整理的设计模式这一个系列,主要是结合了以下几本书 : 《设…...

RT-Thrad|STM32F103+ESP8266 S01+RT-Thread联网之环境搭建(1/3)

文章目录前言硬件准备百问网STM32F103ESP8266 01SESP8266 介绍ESP8266 01S技术规格参数软件准备下载安装 Keil μVision5Pack Installer安装 ST-Link 驱动获取RT-Thread源码下载安装 RT-Thread env 工具文章列表 RT-Thrad|STM32F103ESP8266 S01RT-Thread联网之环境搭建(1/3)RT…...

elementUI-Tree 树形控件的使用

elementUI-Tree 树形控件的使用 实现效果: 控件的官方使用说明 控件要求返回的数据结构 {"success": true,"code": 20000,"message": "成功","data": {"items": [{"id": "1394579386…...

Unity基础之C#核心篇笔记4:多态

Unity基础之C#核心篇笔记4:多态多态1.多态的概念2.解决的问题3.多态的实现4.总结抽象类和抽象方法1.抽象类2.抽象函数3.总结4.练习题接口1.接口的概念2. 接口的申明3.接口的使用4.接口可以继承接口5.显示实现接口6.总结7.练习题密封方法1.密封方法基本概念2.实例3.总…...

用Python爬取彼岸图网图片

用Python爬取彼岸图网图片 *使用了 四个模块 import time import requests from lxml import etree import os 没有的话自行百度安装。 #encoding utf-8 import time import requests from lxml import etree import os# http://www.netbian.com/ 爬虫 if __name__ __mai…...

第k个数(快速选择)

算法思路 快速选择: 1.即任意选一个数,将数组划分为二。 2.最终根据该数所在的位置,即第?大,选择第k大的数字所在区间进行划分。 时间复杂度分析,第一次划分n,下一次划分期望n/2,n/4…累加和小…...

yolov5 detect.py报错

新手求助 yolov5训练了自己的数据集后,test没问题,但是运行detect.py就报错了,一直找不到问题所在, 求大佬指点指点...

DEX 争霸战火升级,BabySwap 会否成为下一代黑马?

在 AMM机制大力推动下,DEX的群雄争霸比预想中来得要快且凶猛。伴随着诸如高盛等主流资本逐步认可DeFi 的意义,在真正的去中心化金融爆发的前夜,可以说谁抢占了DEX 红海的先机,谁就赢得了未来。 从早期以太坊的Uniswap和DoDo&…...

flutter 常用的第三方组件

引用文章链接: https://www.jianshu.com/p/a523e5f131b2 1、格式化日期时间组件:https://pub.dev/packages/date_format 2、日期选择组件:https://pub.dev/packages/flutter_cupertino_date_picker 3、轮播图组件:https://pub.…...

Android面试回忆录:帮助程序员提高核心竞争力的30条建议,真香!

**新技术层出不穷,去年kotlin到如今Flutter,技术迭代,你是否会变得固步自封?**那么看本篇文章帮你解决问题,让你知道怎么样学习,学习那些技术点才能不被时代的迭代快速淘汰! 首先,先…...

2021-05-30解决centos+宝塔面板,FTP传输421 Too many connections问题错误

解决centos宝塔面板,FTP传输421 Too many connections”问题错误 1、首先连入服务器 在/www/server/pure-ftpd/etc下,找到pure-ftpd.conf 2、vim pure-ftpd.conf 没有vim的,用其他编辑软件也可以 3、找到 #Maximum number of sim clients wit…...

RK3399 DDR频率修改

RK3399 DDR频率修改 一、DDR当前频率获取与可调节范围 1、获取当前DDR频率、可调值、容量 cat /sys/class/devfreq/dmc/cur_freq2、查看DDR频率可调节的值 cat /sys/class/devfreq/dmc/available_frequencies3、获取DDR容量 cat /proc/meminfo二、DDR测试定频 1、因为RK3…...

javascript正则表达式常用合集

javascript正则表达式常用的合集 参考网址 {n}: n 是一个正整数,匹配了前面一个字符刚好出现了 n 次 {n,}: n是一个正整数,匹配前一个字符至少出现了n次 {n,m}: n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0&…...

qApp加载qss技巧

使用Qt加载qss样式,一般操作是读取文件,通过setStyleSheet设置 但是qApp只需如下: qApp->setStyleSheet("file:///:/test.qss");//只适用于qApp...

发现一款好用到爆的数据库工具 - DataGrip(就是耗内存)

作者:Atzuge cnblogs.com/zuge/p/7397255.html 最近看到一款数据库客户端工具,DataGrip,是大名鼎鼎的JetBrains公司出品的,就是那个出品Intellij IDEA的公司。 - 就是耗内存 DataGrip是一款数据库管理客户端工具,方便…...

Java 类加载器(ClassLoader)的实际使用场景有哪些?

什么是classloader classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加…...

Bad owner or permissions on C:\\Users\\USER/.ssh/config on Windows

Bad owner or permissions on C:\Users\USER/.ssh/config 问题描述 由于使用vscode远程连接服务器突然新增了C:\Users\USER/.ssh/config ,再powershell/cmd下面使用openssh(windows自带)连接服务器会出现Bad owner or permissions on C:\\U…...

React方向的前端面试题

1、React的生命周期? React中只有类组件有生命周期可言。 其中包含三个状态: Mounting:此时已经插入了真实的DOM; Updating:正在被重新渲染; Unmounting:已经移出真实的DOM。 生命周期的方…...

理解“same-site“ 和 “same-origin“

Understanding "same-site" and "same-origin" 作者:Eiji Kitamura 译者:weixsun 原文:Understanding "same-site" and "same-origin" "same-site" and "same-origin" are …...

位图和矢量图转换工具推荐

相信做平面设计的大家,都遇到过素材是位图放大后不清晰的情况,十分影响设计的美观。而矢量图是根据几何特性来绘制图形,放大后图像不会失真。所以这篇文章教大家位图转矢量图。 一、使用CorelDRAW CorelDRAW是一款专业的平面设计软件,专注于…...

前端常见跨域解决方案(全)

文章目录什么是跨域?什么是同源策略?同源策略限制以下几种行为常见跨域场景跨域解决方案一、 通过jsonp跨域二、 document.domain iframe跨域三、 location.hash iframe跨域四、 window.name iframe跨域五、 postMessage跨域六、 跨域资源共享&#x…...

云南:探索旅游电子合同区块链应用,君子签助推旅游管理智慧发展

近日,云南省文化和旅游厅、云南省发展和改革委员会、云南省教育厅等十部门联合印发《云南省深化“互联网+旅游”推动旅游业高质量发展实施方案》(以下简称《实施方案》),提出:整合全国旅游电子合同等系统数…...

盘点golang中的开发神器

本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用async-profiler剖析cpu性能,用jstack、jmap、arthas等来排查问题。 作…...

腾讯T2大佬手把手教你!大数据开发和java开发加班严重吗

前言 面试时间将近两个小时(期间等待二面面试官来面我的时候等了半个多小时)面试官问的东西很多,还挖了好几个坑,一个技术点套着一个技术点的问,一定要做好万全的准备。问了一些基本层面上的技术点都答出来了&#xf…...

unity知识记录

1、assetbundle资源加密方式(unity Plus和unity Pro支持) 针对Unity资源包-AssetBundle格式简单且容易破解的问题,Unity中国团队推出了Unity AssetBundle 加密方案 注意:秘钥长度为16位字符(128bit),目前AssetBundle…...

腾讯T2大佬手把手教你!java字符串保留小数点后两位

前言 面试时间将近两个小时(期间等待二面面试官来面我的时候等了半个多小时)面试官问的东西很多,还挖了好几个坑,一个技术点套着一个技术点的问,一定要做好万全的准备。问了一些基本层面上的技术点都答出来了&#xf…...

HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法

HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法参考文章: (1)HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法 (2)https://www.cnblogs.com/mmykdbc/p/9395390.html (3)h…...

Echarts - 去掉图表横纵坐标轴刻度线(小细条分割线)

效果图 去掉前: 去掉后: 实现方法 在 xAxis、yAxis 配置项中分别加入以下代码: axisTick: {show: false }...

报考MBA的要求是什么?

报考MBA的要求是什么? MBA要求毕业后有三年以上工作经验,大专毕业后有五年以上工作经验,或硕士毕业后2年以上工作经验 MBA考生要求: 学士学位:毕业后3年以上工作经验 大专:毕业后5年以上工作经验 硕士…...

一、【redux】redux简介 mini版求和Demo

文章目录1、学习文档2、redux是什么3、什么情况下需要使用redux4、redux工作流程5、redux的三个核心概念5.1、action5.2、reducer5.3、store6、redux的核心API6.1、createStore()6.2、store对象6.3、applyMiddleware()6.4、combineReducers()7、求和Demo(纯react版&…...

计算机技术应用包括哪些,计算机的应用包括哪些呢?

计算机是人类科学技术上一项伟大的成就,如今计算机的应用范围已经从科学计算扩展到人类社会的各个领域。计算机之所以如此普及,是由其自身特点所决定的。接下来小编为大家整理了计算机的应用包括哪些呢?希望对你有帮助哦!Computer—Our Good FellowsWha…...

计算机软件系统的组成及功能,计算机软件系统的组成以及工作原理,你知道吗?...

大家都知道,计算机是由很多硬件连接在一起组成的,那么安装完硬件之后,软件也是必不可少的,否则计算机将无法为我们工作。只有硬件的计算机叫做裸机,还不能用它做事情。配上各种软件以后,才能称之为计算机系…...

西邮linux小组2019-2021面试题总结

这篇文章是对linux 近三年的纳新面试题的小小总结,篇幅有点长,希望你可以耐心看完,看完你一定有收获,有什么不妥可以提出的吖 知识点一:sizeof()和strlen()的异同 先看道…...

leetcode6. Z 字形变换python_字符串

题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的输出需要从左往右逐行读取&…...

西邮linux面试题,西邮Linux兴趣小组纳新免试题! come on!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼密文:00110111011110101011110010101111001001110001110000000000000000111001101110110101111000110101001011110110000000000000000000000000000000000000000000000000000000000100111000000000000000000000000000000…...

西邮计算机网络实验报告,西邮计算机网络实验报告内容模板-实验二-交换机基本配置...

《西邮计算机网络实验报告内容模板-实验二-交换机基本配置》由会员分享,可在线阅读,更多相关《西邮计算机网络实验报告内容模板-实验二-交换机基本配置(10页珍藏版)》请在人人文库网上搜索。1、一. 实验目的1.通过查看MAC地址转发表,理解交换…...

西邮ctf2020 web之文件包含解析

比赛地址:http://39.97.182.97/ 这四道考题都是利用的php伪协议 参考php伪协议,利用文件包含漏洞 第一题:http://watcem.top/wangzhan/27.php 直接构造 http://watcem.top/wangzhan/27.php?fileflag.txt得到flag 第二题:ht…...

西邮实验室汇总项目

项目名称项目人员项目描述项目周期项目技术项目中遇到的问题项目链接 项目名称 西邮实验室汇总 项目人员 wangchun 项目描述 本项目旨在汇总西邮的各个实验室情况,以便新生参考,了解西邮都有哪些实验室、及各个实验室的方向等信息 项目周期 5天…...

西邮Linux兴趣小组2019面试题总结

西邮Linux兴趣小组2019面试题总结 unsigned int unsigned int 取值范围为0~4294967295,当i减到0后,再进行一次自减,会变为4294967295,永远满足>0的条件,因此会打印出无数个’’. (1) 使用了一个中间变量,先把a的值赋…...

西邮linux兴趣小组2019,2020补纳面试题

西邮linux兴趣小组2019,2020补纳面试题2019补纳2020补纳C语言基础数据结构与算法GNU Linux常识关于纳新试题,您需要了解: 本题仅作为面试有限参考为了代码的简洁,略去了大部分不影响理解的预处理指令题目难度与序号无关若无特殊声明,均假设在…...

西邮Linux兴趣小组2019纳新试题总结

1.下面代码段将打印出多少个’’?运用相关知识解释该输出。 int main() {for(unsigned int i3;i>0;i--){putchar();} }无数个,因为无符号数无负,造成死循环。2.下列三种交换整数的方式是如何实现交换的? /*(1)*/ int c a ; …...

西邮计算机网络实验,西邮网络实验报告.doc

西邮网络实验报告RIP实验环境:实验步骤:在pocket tracer中搭建实验环境。为各端口分配IP地址(合理分配4个子网即可)分别为路由器各有效端口配置IP如:R0(config)#int fa 0/1R0(config-if)#ip address 192.168.1.1 255.255.255.0R0(config-if)#…...

西邮linux兴趣小组2019-2021三年纳新试题浅析

西邮linux兴趣小组2019-2021三年纳新试题浅析西邮 Linux 兴趣小组 2019 纳新试题西邮 Linux 兴趣小组 2020 纳新试题西邮 Linux 兴趣小组 2021 纳新试题关于纳新试题,您需要了解: 本题仅作为面试有限参考为了代码的简洁,略去了大部分不影响理解的预处理…...

2021西邮linux兴趣小组纳新题解

目录1. 请试着解释其输出2. 下面代码的运行输出结果是什么,并说说你的理解。3. 这段代码的输出结果是什么?为什么会出现这样的结果?4. 下面程序会出现什么结果?为什么会出现这样的结果?5. 下面代码的运行输出结果是什么…...

西邮Linux兴趣小组2022纳新面试题题解

本题目只作为Xiyou Linux兴趣小组2022纳新面试的有限参考。为节省版面,本试题的程序源码省去了#include指令。本试题中的程序源码仅用于考察C语言基础,不应当作为C语言「代码风格」的范例。题目难度随机排列。 所有题目编译并运行于x86_64 GNU/Linux环境…...

西邮Linux兴趣小组面试题总结(2020)

面试题总结 宏定义 #define 标识符 字符串 2019年面试题 下面代码段的输出结果是什么?输出该结果的原因是? #define X a b int main(int argc, char *argv[]) {int a 1, b 1;printf("%d\n", X * X);return 0; } 代码相当于 int main(in…...

西邮杯acm试题

—明天c语言机试赶紧花一天时间把西邮杯写下练练手… 写的脖子痛… 问题:可逆素数 题目描述 若将某一素数的个位数字顺序颠倒后得到的数任然是素数,则此素数称为可逆素数 判断给定的n个数据是否是可逆素数。 输入 第一行为n值,第二行输…...

西邮计算机学院楚东方,西邮计算机系课堂教学质量监控办法.doc

计算机学院本科课堂教学质量监控办法? ?课堂教学是整个教育、教学过程的最主要环节,加强课堂教学质量监控是全面提高教学质量的关键,同时对保证本学院正常教学秩序,树立良好教风、学风,培养全面发展的高素质人才具有重要意义。为…...

西邮Linux兴趣小组2020纳新试题

第一题&#xff1a; 运行下面的代码&#xff0c;输出结果是什么&#xff0c;请解释说明&#xff1a; #include<stdio.h> int i; int main(int argc, char *argv[]) {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0…...