python输出字体的大小_Python密码学编程:文件的加密与解密

27b82bfc21329c2c4923a5b54fb62a14.png

在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的。但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符。

本章要点

  • open()方法。
  • 读、写文件。
  • write()、close()及read()文件对象操作方法。
  • os.path.exists()方法。
  • upper()、lower()及title()字符串操作方法。
  • startswith()及endswith()字符串操作方法。
  • time模块及time.time()方法。

10.1 纯文本文件

对文件进行置换操作的程序只对纯文本(无格式文本)文件进行加/解密,这类文件指的是那些后缀名为 .txt 且文件中不包含除文本数据以外的内容的文件。要编写这类文件,可以选择在Windows系统下使用Notepad、在macOS系统下使用TextEdit,或者在Linux系统下使用gedit。(Word这样的文本处理程序同样也可以生成纯文本文件,但记住这些文件不能保存字体样式、字体大小、颜色或其他任何格式。)除上述文本编辑软件外,读者甚至可以使用IDLE文本编辑器,只要将文件后缀保存为 .txt 而不是通常使用的 .py 即可。

如果需要纯文本文件的样例,则可以从网络上下载一些txt小说,要将纯文本手动输入程序中,可能要花费很多时间,但如果使用现成的txt文件,则程序在数秒内就可以完成加密操作。

10.2 使用置换密码加密文件的源代码

在前两章置换密码测试程序的基础上,针对文件的置换密码程序引入了transposition Encrypt.py和transpositionDecrypt.py这两个文件,这样就可以调用encryptMessage()和decryptMessage() 这两个函数。因此,编写这个新程序将不用重新输入两个函数的代码。

选中 File▶New File,打开一个新的编辑窗口,将下列代码输入编辑窗口并将其存储为transpositionFileCipher.py。接下来,访问本书配套资源下载一个名为frankenstein.txt的文件,并将其放置在与py文件相同的路径之下,按下F5键运行这个程序。

transpositionFileCipher.py

1. # 置换密码加/解密文件2. # https://www.nostarch.com/crackingcodes/ (BSD Licensed)3.4. import time, os, sys, transpositionEncrypt, transpositionDecrypt5.6. def main():7.   inputFilename = 'frankenstein.txt'8.   # 注意,如果具有outputFilename 名称的文件已存在,则此程序9.   # 覆盖该文件
10.   outputFilename = 'frankenstein.encrypted.txt'
11.   myKey = 10
12.   myMode = 'encrypt' # 设置为'encrypt'或'decrypt'
13.
14.   # 如果输入文件不存在,则程序提前终止
15.   if not os.path.exists(inputFilename):
16.     print('The file %s does not exist. Quitting...' % (inputFilename))
17.     sys.exit()
18.
19.   # 如果输出文件已存在,则给用户退出的机会
20.   if os.path.exists(outputFilename):
21.     print('This will overwrite the file %s. (C)ontinue or (Q)uit?' %(outputFilename))
22.     response = input('> ')
23.     if not response.lower().startswith('c'):
24.       sys.exit()
25.
26.   # 从输入文件中读取消息
27.   fileObj = open(inputFilename)
28.   content = fileObj.read()
29.   fileObj.close()
30.
31.   print('%sing...' % (myMode.title()))
32.
33.   # 测量加/解密所需时间
34.   startTime = time.time()
35.   if myMode == 'encrypt':
36.     translated = transpositionEncrypt.encryptMessage(myKey, content)
37.   elif myMode == 'decrypt':
38.     translated = transpositionDecrypt.decryptMessage(myKey, content)
39.   totalTime = round(time.time() - startTime, 2)
40.   print('%sion time: %s seconds' % (myMode.title(), totalTime))
41.
42.   # 将置换后的消息写入输出文件
43.   outputFileObj = open(outputFilename, 'w')
44.   outputFileObj.write(translated)
45.   outputFileObj.close()
46.
47.   print('Done %sing %s (%s characters).' % (myMode, inputFilename,len(content)))
48.   print('%sed file is %s.' % (myMode.title(), outputFilename))
49.
50.
51. # 如果运行 transpositionCipherFile.py (而不是作为模块引入),则
52. # 调用main() 函数
53. if __name__ == '__main__':
54.   main()

10.3 运行置换密码加密文件程序的样例

运行transpositionFileCipher.py得到的输出如下。

Encrypting...
Encryption time: 1.21 seconds
Done encrypting frankenstein.txt (441034 characters).
Encrypted file is frankenstein.encrypted.txt.

这样就创建出了一个名为frankenstein.encrypted.txt 的新文件,该文件与 transposition FileCipher.py 在同一个路径下。使用IDLE文件编辑器打开这个新文件,就可以看到frankenstein.txt 中的文本内容被加密后的结果了。它应有的格式如下所示。

PtFiyedleo a arnvmt eneeGLchongnes Mmuyedlsu0#uiSHTGA r sy,n t ys
s nuaoGeL
sc7s,
--snip--

每次加密一个文件,都可以将加密的结果发送给另一个人去解密它,对方同样需要文件置换操作程序的源代码。

要解密密文,可以对源代码进行下述改变(粗体部分),随后再次运行这个程序。

7.   inputFilename = 'frankenstein.encrypted.txt'8.   # 如果具有outputFilename 名称的文件已存在,则此程序9.   # 覆盖该文件
10.   outputFilename = 'frankenstein.decrypted.txt'
11.   myKey = 10
12.   myMode = 'decrypt' # 设置为 'encrypt'或'decrypt'

这时候运行该程序,就会在当前文件夹下创建出一个名为 frankenstein.decrypted.txt 的新文件,此时这个新文件的内容和原始明文是一致的。

10.4 文件操作

在深入研究 transpositionFileCipher.py 文件的源代码之前,首先要明白Python是如何对文件进行操作的。读取文件内容的3个步骤分别是打开文件、读取文件内容并将其存储到一个变量中、关闭文件。类似地,要将新内容写入文件中时,首先必须打开(或创建)一个文件,接着将新的内容写入其中,最后关闭这个文件。

10.4.1 打开文件

Python可以通过open()方法打开一个文件以供读取、写入内容时使用,其第一个参数为文件名。当要打开的文件和Python程序处于同一个文件夹下时,可以直接使用文件名,例如“thetimemachine.txt”,如果当前文件夹存在这么一个文件,则打开它的Python指令如下所示。

fileObj = open('thetimemachine.txt')

这样,一个文件对象就被存储在变量 fileObj 中了,之后进行读写操作时使用这个变量即可。

还可以用文件的绝对路径(absolute path)作为第一个参数,这样引号内就需要包括文件所在的文件夹及其所有父文件夹的名称,举个例子,类似“C:UsersAlfrankenstein.txt”(Windows系统下),或“/Users/Al/frankenstein.txt”(macOS及Linux系统下)格式的都是绝对路径。记住,Windows系统下,反斜线(/)前一定要多加一个反斜线用于转义。

举个例子,若想打开“frankenstein.txt”文件,则需要将其路径以字符串的形式作为open()方法的第一个参数(绝对路径的格式由使用的操作系统决定)。

fileObj = open('C:UsersAlfrankenstein.txt')

文件对象有多种用于读取、写入和关闭文件的方法,下面将对这些方法进行详细介绍,为方便说明这里调换一下顺序。

10.4.2 数据写入及文件关闭

对于文件的加密程序而言,在读取文本内容之后就需要将加密的数据写入一个新的文件中,这时用到的方法就是write()。

要想使用一个文件对象的write()方法,首先需要将文件以写模式打开,即将字符串 'w' 传入open()方法作为其二个参数。open()方法的第二个参数是一个可选参数(optional parameter),这意味着open()方法在没有第二个参数的情况下仍然能够被调用。例如,将下列代码输入交互式运行环境中。

>>> fileObj = open('spam.txt', 'w')

这一行以写模式创建了一个名为“spam.txt”的文件,则可以对其进行编辑。如果在open()方法创建新文件的路径下存在一个同名文件,则该同名文件将被重写,因此,以写模式使用opne()方法时需要万分小心。

spam.txt 以写模式打开后,就可以调用write()方法往其中写入内容了。write()方法有一个参数:存储在一个字符串中的、将要被写入文件的内容。将下列代码输入交互式运行环境,把字符串Hello, world!写入 spam.txt 中。

>>> fileObj.write('Hello, world!')
13

上述代码将字符串Hello, world!作为参数传入write()方法,把该字符串写入文件 spam.txt 中并打印出数字13,这个数字代表了写入文件中的字符数。

对文件的操作执行完成之后,需要通过调用文件对象的close()方法告知Python此事。

>>> fileObj.close()

除上述必定会覆盖原文件内容的写模式之外,还存在一个附加模式,在该模式下字符串会被添加到文件已有内容的末尾。尽管本章程序中没有用到这个模式,读者也可以自己尝试以附加模式打开文件,只需要将字符串 'a' 作为 open() 方法的第二个参数即可。

如果在调用文件对象的write()方法时,遇到了“io.UnsupportedOperation: not readable”的报错信息,则可能是因为没有以写模式打开文件。调用open()方法的过程中若没有包括可选参数,则其默认值将被自动设置为写模式('r'),该模式下只允许使用者调用文件对象的read()方法。

10.4.3 读取文件

read()方法能够以字符串的形式返回文件中包含的所有内容,为验证其功能,本节将读取之前用wirte()方法创建的 spam.txt 文件。在交互式运行环境中运行如下代码。

>>> fileObj = open('spam.txt', 'r')
>>> content = fileObj.read()
>>> print(content)
Hello world!
>>> fileObj.close()

打开文件之后创建的文件对象存储在变量 fileObj 中,如果该对象存在,则可以使用read()方法读取文件的内容并将其存储在变量 content 中,随后打印该变量的值。执行完上述对文件对象的操作后,使用close()方法关闭该文件。

如果遇到“IOError: [Errno 2] No such file or directory”的报错信息,请确保想要打开的文件就在读者认为的路径下,并再次检查文件名和文件夹的名称是否正确输入。(文件夹即路径。)

在transpositionFileCipher.py程序中,对文件进行的加密和解密需要用到上文提到的所有open()、write() 及 close()方法。

10.5 创建main()函数

transpositionFileCipher.py 程序的第一部分应该看起来十分眼熟,第4行是一个import 语句,引入了transpositionEncypt.py和transpositionDecrypt.py两个程序和Python库中的time、os及sys模块,接下来的部分即main()函数,其中创建了程序需要用到的变量。

1. # 置换密码加/解密文件
2. # https://www.nostarch.com/crackingcodes/ (BSD Licensed)
3.
4. import time, os, sys, transpositionEncrypt, transpositionDecrypt
5.
6. def main():
7.   inputFilename = 'frankenstein.txt'
8.   # 注意,如果具有outputFilename 名称的文件已存在,则此程序
9.   # 覆盖该文件
10.   outputFilename = 'frankenstein.encrypted.txt'
11.   myKey = 10
12.   myMode = 'encrypt' # 设置为 'encrypt'或'decrypt'

变量 inputFilename 存储了待读取文件名的字符串,而加密后(或解密后)的内容写入以变量 outputFilename 的值命名的文件内。程序涉及的置换密码使用一个整数作为密钥,并存储在myKey中,同时,程序需要一个变量 myMode 存储字符串encrypt或decrypt以决定对 inputFilename 存储的文件进行何种操作。在读取 inputFilename 文件之前,首先要使用 os.path.exists() 检查该文件是否存在。

10.6 检查文件是否存在

读取文件往往不会存在什么危害,但往文件中写入内容时就需要多加小心了,这是因为以写模式调用open()方法时,若原文件已存在,会覆盖掉原文件中的内容。针对这个潜在问题,程序可以使用os.path.exists() 方法,检查要打开的文件是否已经存在。

10.6.1 os.path.exists() 方法

os.path.exists()方法只有一个参数,即文件名或指向文件的文件路径,如果文件存在,则返回True;否则返回False。该方法包含在path模块内,而path模块包含在 os 模块中,因此引入 os 模块时,path模块一并被引入了。

将下列代码输入交互式运行环境。

>>> import os❶ >>> os.path.exists('spam.txt')False>>> os.path.exists('C:WindowsSystem32calc.exe') # WindowsTrue>>> os.path.exists('/usr/local/bin/idle3') # macOSFalse>>> os.path.exists('/usr/bin/idle3') # LinuxFalse

在本例中,os.path.exists()方法证实了Windows系统中存在calc.exe文件。当然,只有在Windows系统下运行Python的时候,才能得到上面的结果。记住,在Windows下输入文件路径时,要在反斜杠前再添加一个反斜杠进行转义。如果使用的是macOS,则上述代码中只有macOS的样例会返回True,同理在Linux系统下只有最后一个例子会返回True。如果没有给出完整的路径❶,则Python会检查当前的工作路径;对IDLE交互式运行环境而言,当前工作路径即安装了Python的文件夹。

10.6.2 使用os.path.exists()方法检查输入的文件是否存在

本章程序的第14~17行使用了os.path.exists()检查 inputFilename 中的文件是否存在,如果没有这一步,就无法获得用于加解密的文件。

14.   # 如果输入文件不存在,则程序提前终止
15.   if not os.path.exists(inputFilename):
16.     print('The file %s does not exist. Quitting...' % (inputFilename))
17.     sys.exit()

若文件不存在,程序将为用户弹出提示并退出。

10.7 使用字符串方法令用户的输入更灵活

接下来,程序需要检查是否存在与 outputFilename 同名的文件,如果存在,则询问用户是输入c继续运行程序还是输入q退出程序。由于用户可能会输入多种回复,例如c、C,甚至是单词Continue,因此程序需要确保可以接收所有这些输入,要实现这一功能,必须使用更多字符串方法。

10.7.1 upper()、lower()和title()字符串方法

upper()和lower()方法能够分别以全大写和全小写返回它们所接收的字符串。将下列代码输入交互式运行环境中以分辨这两个方法是如何对同一个字符串进行操作的。

>>> 'Hello'.upper()
'HELLO'
>>> 'Hello'.lower()
'hello'

lower()、upper()方法以小写和大写的形式返回字符串,title()方法也和它们类似,然而该方法返回的是各单词首字母大写的字符串,这意味着字符串中的每个单词的首字母是大写,而其余所有字母都是小写。将下列代码输入交互式运行环境中。

>>> 'hello'.title()
'Hello'
>>> 'HELLO'.title()
'Hello'
>>> 'extra! extra! man bites shark!'.title()
'Extra! Extra! Man Bites Shark!'

本章程序会在稍后部分使用title()方法,来为输出的信息格式化。

10.7.2 startswith()和endswith()方法

若字符串以参数指定的字符串开头,则startwith()方法返回True。将下列代码输入交互式运行环境。

>>> 'hello'.startswith('h')True>>> 'hello'.startswith('H')False>>> spam = 'Albert'❶ >>> spam.startswith('Al')True

startswith()方法对大小写敏感,同时也可以接收多字符的字符串❶。

endswith()方法用于检查字符串是否以某一个特定字符串结尾。将下列代码输入交互式运行环境。

>>> 'Hello world!'.endswith('world!')True
❷ >>> 'Hello world!'.endswith('world')False

字符串的匹配必须一字不差,注意,由于❷中缺少感叹号,因此endswith()的返回结果为False。

10.7.3 在程序中使用上述字符串方法

之前提到过,程序需要能够接收所有以字母C开头的响应,无论大小写,这意味着不管用户输入的是C、continue、c还是其他以C开头的字符串,程序都需要对文件进行重写。使用lower()和upper()方法可以使程序在处理用户输入的字符串时更加灵活。

19.   # 如果输出文件已存在,则给用户退出的机会
20.   if os.path.exists(outputFilename):
21.     print('This will overwrite the file %s. (C)ontinue or (Q)uit?' %(outputFilename))
22.     response = input('> ')
23.     if not response.lower().startswith('c'):
24.       sys.exit()

第23行,取字符串的首字母并使用startswith()方法来检查它是否为C。由于startswith()方法大小写敏感且检查的是小写的 'c',因此在调用它之前使用lower()方法改变response字符串的首字母,使其保持为小写的 'c'。如果用户没有输入以C开头的响应,则if的条件语句将得到True(因为其中包含一个not),于是sys.exit()语句被调用,程序终止。从技术上来说,用户不需要输入q来退出,任何不以C开头的字符串都会导致 sys.exit() 方法的调用,从而使程序退出。

10.8 读取作为输入的文件

第27行,程序开始使用本章开头讨论过的文件对象方法。

26.   # 从输入文件中读取消息
27.   fileObj = open(inputFilename)
28.   content = fileObj.read()
29.   fileObj.close()
30.
31.   print('%sing...' % (myMode.title()))

第27~29行打开了与inputFilename同名的文件,读取它的内容并存储到变量 content 中,随后关闭了文件。读取完文件之后,第31行为用户输出了一行提示信息,告知他们加密或解密已经开始。由于变量 myMode 中存储着字符串encrypt或decrypt,调用title()字符串方法将它的首字母转换为大写,又在它之后添加了ing字符串,因此最终它显示的内容是 Encrypting...或者Decrypting...。

10.9 计算加/解密所需的时间

对一个文件进行全面的加/解密往往要比仅加/解密一个短短的字符串要耗时多,而用户可能会想要了解加/解密文件的过程具体需要多长时间。程序可以使用 time 模块计算加/解密过程所需的时间长度。

10.9.1 time模块和time.time()方法

time.time()方法以浮点数的形式返回从1970年1月1日至当前时间的总秒数,这个数字被称为UNIX时间戳。将下列代码输入交互式运行环境,观察该方法的运行结果。

>>> import time
>>> time.time()
1540944000.7197928
>>> time.time()
1540944003.4817972

由于time.time()返回的是一个浮点数,因此它可以精确到毫秒。当然,time.time()显示的时间由程序员调用它的时间决定,并且要将它转化为正常的时间也有一定难度,比如很难看出 1540944000.7197928 就是2018年的10月30日(星期二)的下午5点左右。然而time.time()非常适合于比较两次调用time.time()之间相差的秒数,因此程序可以使用它计算运行时间。

举个例子,如果按照下述代码,把前一段代码中两次调用time.time()的时间相减,就可以得到两次调用中间经过的时间了。

>>> 1540944003.4817972 - 1540944000.7197928
2.7620043754577637

如果想要编写对日期和时间进行操作的代码,可以查阅 datetime 模块的相关资料。

10.9.2 在程序中使用time.time()方法

第34行,time.time()方法返回了当前时间并将其存储到名为 startTime 的变量中;第35~38行根据变量 myMode 的值是encrypt还是decrpt来调用encryptMessage()或decryptMessage()。

33.   # 测量加/解密所需时间
34.   startTime = time.time()
35.   if myMode == 'encrypt':
36.     translated = transpositionEncrypt.encryptMessage(myKey, content)
37.   elif myMode == 'decrypt':
38.     translated = transpositionDecrypt.decryptMessage(myKey, content)
39.   totalTime = round(time.time() - startTime, 2)
40.   print('%sion time: %s seconds' % (myMode.title(), totalTime))

加/解密完成后,第39行再次调用了time.time()方法,并用这次调用的时间减去startTime,得到的结果是两次调用time.time()方法的间隔时间。time.time() - startTime表达式将所得结果传给round()方法,也就是将其取整,因为程序并不需要精确到毫秒。这个整数值赋值给了变量 totalTime。第40行使用了字符串连接,并为用户打印了程序所处的模式及用于加密或解密的时长。

10.10 将输出写入文件

加密后(或解密后)的文件内容现在存储在变量translated中,但这个变量在程序终止时就会被释放,因此需要一个文件来存储这个字符串,这样哪怕程序停止执行,结果仍能保存。第43~45行的代码进行了这部分操作,打开了一个新文件[将w传给open()方法]并调用文件对象的write()方法。

42.   # 将置换后的消息写入输出文件
43.   outputFileObj = open(outputFilename, 'w')
44.   outputFileObj.write(translated)
45.   outputFileObj.close()

接下来在第47行和第48行打印了更多信息,告知用户输出文件的名称及加/解密过程已经结束。

47.   print('Done %sing %s (%s characters).' % (myMode, inputFilename,len(content)))
48.   print('%sed file is %s.' % (myMode.title(), outputFilename))

第48行是main()函数的最后一行。

10.11 调用main()函数

第53行和第54行(在第6行def语句执行之后被执行的两行)调用了main()函数,前提是当前程序处于运行状态而非被引用的状态下。

51. # 如果运行 transpositionCipherFile.py (而不是作为模块引入),则
52. # 调用main() 函数
53. if __name__ == '__main__':
54.   main()

7.12节对这部分进行了详细解释。

10.12 小结

除了open()、read()、write()和close()这些帮助我们在硬盘上加密大文本文件的函数,transpositionFileCipher.py 程序中没有包含太多的新内容。读者学到了如何使用 os.path.exists()函数检查文件是否已经存在。同时如读者所见,编程时可以通过在新程序中引入之前所写程序的函数来拓展程序的能力,这大大增长了计算机加密信息的能力。

除此之外,读者也学习到了一些有用的字符串方法,它们使得程序在接收yoghurt输入时更加灵活;time模块也可以帮助计算程序运行的时间。

和实现凯撒密码的程序不同的是,如果想要使用暴力算法破解通过置换密码加密的文件,会出现太多可能的密钥。但如果编写一个能够识别英语(和其他无意义的乱码)的程序,计算机就可以检查成千上万种解密结果,并确定一把可以成功将密文解密为英语的密钥。这在第11章中会详细介绍。

本文摘自《Python密码学编程 第2版》,[美] 阿尔·斯维加特(Al Sweigart) 著,郑新芳,赵怡翾译。

22a1eaecdf700134c896736497749a60.png
  • 易懂的密码学,畅销书全面升级
  • Python编程实现加密算法的初学者指南

通过阅读本书,您将学习如何通过 Python 编程制作和破解密码,以此创建和发送密文!学习 Python 编程的基础 知识之后,您将从使用反向和凯撒密码的简单程序开始,了解为公开密钥加密的方法,该加密方法用于保护在线事务的 正常运作,包括数字签名和电子邮件。另外,您还将学习如何使用经典密码(如置换密码和维吉尼亚密码)对文本进行加密。 每个程序都包含完整的代码和逐行说明。本书结尾,您将学习如何使用 Python 进行编码。

您还将学习以下内容:

  • 将循环、变量和流控制语句组合到实际的工作程序中;
  • 使用字典文件检测解密的消息是有效的英文还是乱码;
  • 创建并测试程序以确保代码正确加密和解密;
  • 对仿射密码进行编码(破解)的示例(使用模块化算术对消息进行加密);
  • 使用暴力算法和频率分析等技术破解密码。

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

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

相关文章

个人工作总结7

时间关系,只能等到编完了程序再做工作总结了,今天是第七天: 一、昨天干了什么? 服务器配置了一大圈,尝试了N1种办法,到最后也没有成功,但好像只差一点点,打算明天上移动应用开发咨询一下老师。 …

电脑k歌软件_金麦客专业k歌app下载|金麦客专业k歌软件 手机安卓版v1.1.5.0 下载...

金麦客专业k歌app能够让用户通过手机直接连接电视,从而在安卓端实现金麦客点歌的目的,平台包含上万高清mv资源,让用户在歌唱时能够更好的代入氛围中,并且还能通过网络直接搜歌,从而在线下载播放,用户在演唱…

python的普通方法、类方法和静态方法

前言 本文主要讲述了python类中的三类常用方法,普通方法、类方法和静态方法。 普通方法会将实例传入方法当中(通常用self表示),类方法会将类传入方法当中(通常用cls表示),静态方法中传入与类无…

局部内部类和匿名内部类的对比

创建内部类的典型的方式是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。 具体代码实现&a…

Nodejs ejs模板引擎

官方网站:https://www.npmjs.com/package/ejs 我们学的 EJS 是后台模板,可以把我们数据库和文件读取的数据显示到 Html 页面上面。它 是一个第三方模块,需要通过 npm 安装 npm install ejs –save 或者 cnpm install ejs --saveNodejs 中使用…

py2中存储的pickle和py3中pickle无法读取的兼容性问题解决方案

问题描述 在py2.7当中,用以下语句将变量存储到pickle当中 with open(../dataset/m_7800/rf_preds.pickle, wb) as f:pickle.dump(rf_preds, f) 这个时候,用py3.6中的pickle取获取存储好的变量 with open(../dataset/m_7800/rf_preds.pickle, rb) as …

linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议。现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行。并行传输数据是指同时传输多个数据位,它们通常需要数据线和时钟线配合工作&a…

div里嵌套了img底部会有白块问题和图片一像素问题解决

div里嵌套了img底部会有白块 因为img默认是按基线(baseline)对齐的。对比一下图片和右边的p, q, y等字母,你会发现这三个字母的“小尾巴”和图片下方的空白一样高。下面这张图中的黑线就是那条基线。 解决方案:一:vertical-align: bottom&…

Nodejs 中的Get、Post

Get、Post 超文本传输协议(HTTP)的设计目的是保证客户端机器与服务器之间的通信。 在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。(一般用于获取数据&#…

利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

问题简述 给定一个 nn的矩阵,矩阵中每行和每列的元素都按升序排列。给定一个 k(k∈[1,n2]), 求再整个矩阵中按从小到大排序为 k的元素。 例如:matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15] ], k = 8,return 13.解题思路该矩阵的行和列都是按从小…

电脑故障扫描修复软件_电脑故障分析:电脑安装软件提示没有权限的解决方法...

我们安装软件时如果没有权限就会导致安装故障,最近就有用户安装软件的时候出现了无法将数值写入键software的错误提示,请验证您对该键拥有足够的访问权限,或者与您的技术支持人员联系。那么遇到这种问题该怎么办呢?接下来就让我们…

Nodejs 路由封装 封装一个类似 express 的路由

1、模块化的方式封装 routes.js: const http require(http); const fs require(fs); const path require(path) const url require(url) const ejs require(ejs) let getFileMime function (extname) {// 把异步读取文件方法改为同步读取文件方法let data fs.readFileSy…

天翼网关 ddns设置_19,微服务网关之Zuul

这一次给大家分享微服务网关的相关知识,这个也是微服务架构中,相当重要的组件之一,来,下面听我徐徐道来1,API网关概览1.1,现有的交互模式存在什么问题?目前,是客户端会直接跟多个微服…

利用bds和dfs解决 LeetCode 107. Binary Tree Level Order Traversal II

问题简述 给定一棵二叉树,返回该二叉树自底向上遍历的结点值(即从左到右,自底向上) 比如给定一颗二叉树 [3,9,20,null,null,15,7] 3/ \9 20/ \15 7 返回的结果为 [[15,7],[9,20],[3] ] 解决方案 解法1:广度优…

MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查

一、 连接数据库 1、连接数据库 清屏命令:cls 查看所有数据库列表:show dbs 二、 创建数据库、查看、删除数据库 1、使用数据库、创建数据库 use itying 如果真的想把这个数据库创建成功,那么必须插入一个数据。 数据库中不能直接插入数据&#xff0…

纯CSS方块转化梯形动画

http://jasonning92.github.io/JasonsBlog/pages/%E7%BA%AFCSS%E6%96%B9%E5%9D%97%E8%BD%AC%E5%8C%96%E6%A2%AF%E5%BD%A2%E5%8A%A8%E7%94%BB.html转载于:https://www.cnblogs.com/sanqianjin/p/5439364.html

如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...

2020春季的一场疫情,让远程办公和在线教育在全球范围内成为一种常态。疫情终将过去,但疫情为人们带来的新的工作及生活方式却将持续地影响着我们。后疫情时代,远程实时互动技术的重要性被提到了新的高度,下一代互联网通信云将如何…

从LeetCode 210. Course Schedule II 了解拓扑排序

问题简述 给定n节课,每节课按0~n-1编号。 在修某些课的时候需要有其它课的基础,必须先上先修课。现在用pair的形式来表示要先修的课,比如 [ [0,1], [1,2] ] 就表示在修课程1之前必须先修课程0,修课程2之前必须修课程1。现在需要给…

LeetCode题解 343.Integer Break

题目:Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. For example, given n 2, return 1 (2 1 1); given n 10, return 36 (10 …

MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

一、索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。 MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 下面是创建索引的命令: db.user.ensureIndex…