首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-open函数

  • 25-03-03 04:30
  • 2814
  • 9154
blog.csdn.net

目录

一、open函数的常见应用场景

二、open函数使用注意事项

三、如何用好open函数?

1、open函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 

一、open函数的常见应用场景

        open函数在Python中是一个非常重要的内置函数,用于打开文件以便进行读取、写入或追加等操作,常见的应用场景有:

1、读取文件内容:当你需要从一个文件中读取数据(如文本、配置、日志等)时,你可以使用 open()函数以只读模式('r')打开文件,并使用文件对象的 read()、readline()或readlines()方法来读取内容。

2、写入文件内容:如果你需要将数据写入一个文件(如生成报告、保存配置、记录日志等),你可以使用open()函数以写入模式('w')或追加模式('a')打开文件,并使用文件对象的write()方法来写入内容。

3、处理二进制文件:对于需要处理图像、音频、视频等二进制文件时,你可以使用'b'标志来以二进制模式打开文件,这允许你读取和写入原始的字节数据。

4、逐行读取文件:当文件非常大或你只需要逐行处理文件时,可以使用readline()方法逐行读取文件,这可以减少内存使用并提高性能。

5、文件搜索和替换:你可以使用open()函数读取文件内容,然后使用字符串操作或正则表达式来搜索和替换文本,完成修改后,可以将新内容写回到原始文件或新文件中。

6、配置和数据存储:配置文件(如INI文件、JSON文件或YAML文件)和数据文件(如CSV文件)经常使用open()函数进行读取和写入,这些文件通常包含应用程序的配置信息或用户数据。

7、文件复制和移动:虽然open()函数本身不直接支持文件复制和移动,但你可以使用它结合其他文件操作函数(如shutil.copy()或os.rename())来实现这些功能。

8、文件锁定和并发访问:在多线程或多进程环境中,你可能需要锁定文件以防止并发访问导致的冲突。虽然Python标准库没有直接提供文件锁定机制,但你可以使用第三方库(如`fcntl`在Unix系统上)或操作系统特定的命令来实现文件锁定。

9、临时文件处理:使用open()函数与`tempfile`模块结合可以创建和管理临时文件,这对于需要临时存储数据的场景(如数据处理、文件转换等)非常有用。

10、与标准输入/输出交互:虽然不直接通过open()函数实现,但你可以使用文件对象与Python的标准输入(`sys.stdin`)和标准输出(`sys.stdout`)进行交互,这些文件对象与常规文件对象类似,允许你以类似的方式读取和写入数据。

11、文件备份与恢复:你可以使用open()函数来读取原始文件的内容,并将其写入另一个文件以创建备份;同样地,你也可以从备份文件中读取内容并将其写入原始文件以恢复数据。

12、文件加密和解密:在处理敏感数据时,加密是一个重要的安全措施。你可以使用open()函数来读取未加密的文件,使用加密算法对其进行加密,并将加密后的数据写入另一个文件;类似地,你也可以读取加密的文件,使用解密算法恢复原始数据,并将其写入一个新文件。

13、文件传输:在网络编程中,你可能需要从一个服务器读取文件并将其写入到另一个服务器,或者从一个文件读取数据并通过网络发送,open()函数可以用于这些场景中的文件读取和写入操作。

14、文本处理和数据分析:使用open()函数读取大量文本数据(如日志文件、文档等),并使用Python的文本处理库(如正则表达式、NLTK等)进行分析;也可以结合数据科学库(如Pandas、NumPy等)进行更高级的数据处理和分析。

15、文件映射:对于非常大的文件,你可能希望将它们映射到内存中以便更高效地访问,虽然这不是open()函数直接提供的功能,但你可以使用`mmap`模块来映射已打开的文件。

16、监视文件变化:虽然这通常不是open()函数直接提供的功能,但你可以结合其他库(如`watchdog`)来监视文件系统的变化,包括新文件的创建、文件的修改或删除等。

17、网络文件和特殊设备: open()函数不仅限于处理本地文件系统上的文件,在某些情况下,你可以使用它来访问网络上的文件(如使用`ftplib`或`smbclient`等库)或特殊设备(如串口设备、数据库连接等),这通常涉及到将设备或网络连接抽象为文件描述符或文件对象,并使用open()函数或类似机制进行访问。

        总之,由于open()函数的灵活性和强大性,其在Python编程中几乎无处不在,几乎任何涉及文件操作的场景都会使用到它。

二、open函数使用注意事项

        在使用Python的open()函数处理文件时,为了确保代码的正确性、安全性和性能,需注意以下事项:

1、文件路径和名称:确保文件路径和名称是正确的,并且指向了有效的文件;使用原始字符串(在字符串前加上`r`)来处理包含反斜杠(`\`)的Windows路径,以避免转义字符的问题。

2、文件打开模式:仔细选择正确的文件打开模式(如'r'、'w'、'a'、'b'等),错误的模式可能导致数据丢失或无法访问文件;当你需要在读取和写入之间切换时,使用'r+'、'w+'或'a+'模式。

3、文件关闭:使用`with`语句来自动关闭文件,即使发生异常也是如此,这可以避免资源泄露和潜在的安全风险;避免在`with`语句之外打开文件并忘记关闭它。

4、异常处理:当处理文件时,应准备好捕获并处理可能出现的异常,如`FileNotFoundError`、`PermissionError`等;使用`try-except`块来捕获和处理这些异常。

5、编码问题:在读取或写入文本文件时,确保指定了正确的字符编码(如'utf-8'),错误的编码可能导致乱码或解码错误;如果不确定文件的编码,可以尝试使用`chardet`等库来检测文件的编码。

6、二进制文件:当处理二进制文件时(如图像、音频、视频等),应使用二进制模式(在模式字符串后添加'b');避免在二进制模式下读取或写入文本数据,这可能导致数据损坏或不可读。

7、文件锁定和并发:在并发环境中,多个进程或线程可能同时访问同一个文件,为了避免数据竞争和不一致,可以考虑使用文件锁定机制;注意,Python标准库并没有直接提供文件锁定的功能,但你可以使用第三方库(如`fcntl`在Unix系统上)来实现。

8、文件大小和内存使用:在处理大文件时,避免一次性读取整个文件到内存中,使用逐行读取、块读取或其他内存友好的方法;考虑使用生成器或迭代器来逐步处理文件内容,以减少内存使用。

9、权限和安全性:确保你有足够的权限来读取或写入文件,如果文件受到保护或具有特定的权限设置,你可能需要额外的权限或认证;避免在代码中硬编码敏感信息(如密码、密钥等),特别是当这些信息与文件访问相关时。

10、备份和恢复:在修改或删除文件之前,考虑先备份原始文件,这可以防止意外数据丢失或损坏;确保你有一种机制来恢复意外删除或修改的文件。

        总之,只有牢记这些注意事项,你才能更安全、更有效地使用Python的open()函数来处理文件。

三、如何用好open函数?

        要用好Python中的open()函数,请遵循一下建议:

1、始终使用`with`语句:使用`with`语句可以确保文件在操作完成后被正确关闭,即使发生异常也是如此,这是处理文件时的最佳实践。

2、明确指定文件打开模式:根据你要进行的操作(读取、写入、追加、二进制等)明确指定文件打开模式。

3、异常处理:使用`try-except`块来处理可能出现的异常,如FileNotFoundError、PermissionError等。

4、编码问题:当读取或写入文本文件时,确保指定正确的字符编码,对于大多数情况,建议使用UTF-8编码。

5、避免硬编码:避免在代码中硬编码文件路径、文件名或打开模式,将这些值放在配置文件、环境变量或命令行参数中,以便更容易地修改它们。

6、二进制文件处理:当处理二进制文件时,使用二进制模式(在模式字符串后添加'b')。

7、文件读写效率:对于大文件,避免一次性读取整个文件到内存中,使用逐行读取、块读取或其他内存友好的方法;写入大文件时,可以考虑使用write()方法的缓冲区(如果未指定,则使用默认的缓冲区大小),或者调用flush()方法来手动刷新缓冲区。

8、文件锁定:在并发环境中,如果需要确保文件访问的原子性,可以考虑使用文件锁定机制,但是请注意,Python标准库并不直接提供跨平台的文件锁定机制,你可能需要使用第三方库。

9、安全性:避免在代码中硬编码敏感信息,如密码或密钥;如果你的应用程序需要处理来自不受信任来源的文件,请确保对它们进行适当的验证和清理,以防止安全漏洞(如目录遍历攻击)。

10、备份和版本控制:在修改或删除重要文件之前,始终备份原始文件;使用版本控制系统(如Git)来跟踪和管理文件的变化,以便在需要时可以轻松地回滚到以前的版本。

11、代码可读性和可维护性:使用有意义的变量名来代表文件对象;注释你的代码,解释你正在做什么以及为什么这样做;遵循一致的代码风和最佳实践,以提高代码的可读性和可维护性。

        总之,通过遵循这些最佳实践和建议,你可以更好地利用Python中的open()函数来处理文件,并确保你的代码是健壮、安全和易于维护的。

1、open函数:
1-1、Python:
  1. # 1.函数:open
  2. # 2.功能:用于打开文件,返回一个文件读写对象,然后对文件进行相应读写操作
  3. # 3.语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  4. # 4.参数:
  5. # 4-1、file(必须):一个字符串或整数
  6. # 4-1-1、相对路径:一个字符串,若文件在当前工作目录中或子文件夹下,则表示要打开的文件名/子文件夹下的文件名
  7. # 4-1-2、绝对路径:一个字符串,若文件不在当前工作目录中,则表示需要输入包含盘符的完整文件路径
  8. # 4-1-3、文件描述符:一个整数,用于在底层文件系统中打开的文件描述符
  9. # 4-2、mode(可选):一个字符串,用于指定文件的打开模式
  10. # 使用前提:文件必须存在
  11. # 4-2-1、r:默认模式,以只读模式打开文件,文件的指针将会放在文件的开头
  12. # 4-2-2、rb:以二进制格式打开文件,并且采用只读模式,文件的指针将会放在文件的开头,一般用于图片、音频等
  13. # 4-2-3、r+:打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件开头进行覆盖)
  14. # 4-2-4、rb+:以二进制格式打开文件,并且采用读写模式,文件的指针将会放在文件的开头,一般用于非文本文件,如图片、音频等
  15. # 使用前提:文件可以不存在,但必须保证文件所在的目录存在
  16. # 4-2-5、w:以只写模式打开文件,若文件存在,则将其覆盖;反之,则创建新文件
  17. # 4-2-6、wb:以二进制格式打开文件,并且采用只写模式,一般用于非文本文件,如图片、音频等
  18. # 4-2-7、w+:打开文件后,先清空原有内容,使其变为一个空的文件,对这个空文件拥有读写权限
  19. # 4-2-8、wb+:以二进制格式打开文件,并且采用读写模式,一般用于非文本文件,如图片、音频等
  20. # 其他情形:文件/文件所在的目录存在与否,不做要求
  21. # 4-2-9、a:以追加模式打开文件,若文件存在,文件指针将放在文件末尾,即新内容会被追加写入到已有内容之后;反之,则创建新文件用于写入
  22. # 4-2-10、ab:以二进制格式打开文件,并且采用追加模式,若文件存在,文件指针将放在文件的末尾,即新内容会被追加写入到已有内容之后;反之,则创建新文件用于写入
  23. # 4-2-11、a+:以读写模式打开文件,若文件存在,文件指针将放在文件末尾,即新内容会被追加写入到已有内容之后;反之,则创建新文件用于写入
  24. # 4-2-12、ab+:以二进制格式打开文件,并且采用追加模式,若文件存在,文件指针将放在文件的末尾,即新内容会被追加写入到已有内容之后;反之,则创建新文件用于读写
  25. # 4-2-13、x:创建并写入模式,若文件存在,则会发生异常;反之,则创建新文件用于写入
  26. # 4-2-14、t:文本模式,默认模式,通常不需要明确指定
  27. # 4-3、buffering(可选):用于指定读写文件的缓冲模式/策略
  28. # 4-3-1、-1:默认模式,表示使用默认缓冲策略(通常是全缓冲或行缓冲,取决于平台和模式)
  29. # 4-3-2、0:表示无缓冲(所有写入操作都直接写入磁盘)
  30. # 4-3-3、1:表示行缓冲(仅在文本模式下有效)
  31. # 4-3-4:>1:如果设置为大于1的整数,则表示缓冲区大小
  32. # 4-3-5:io.DEFAULT_BUFFER_SIZE:使用系统默认的缓冲区大小
  33. # 4-4、encoding(可选):用于解码或编码文件的编码方式,默认为None,表示使用现有平台默认的编码方式,一般为UTF-8;常见的编码方式有utf-8、ascii、latin1等
  34. # 4-5、errors(可选):表示读写文件时遇到错误的报错级别
  35. # 4-5-1、strict:严格级别,字符编码有报错即抛出异常,默认级别,errors传入None即按此级别处理
  36. # 4-5-2、ignore:忽略级别,字符编码有错误,忽略掉
  37. # 4-5-3、replace:替换级别,字符编码有错的,替换成符号“?”
  38. # 4-6、newline(可选):表示控制文件读取和写入时如何处理换行符,只对文本模式有效,可以是 None、''、'\n'、'\r' 或 '\r\n'等,这对于跨平台文件兼容性可能很重要,因为不同的操作系统使用不同的换行符
  39. # 4-7、closefd(可选):表示传入的file参数类型,默认为True,传入文件路径时,一定为True;传入文件句柄,则为False
  40. # 4-8、opener(可选):一个可调用对象,用于打开文件描述符,默认为None;这通常不是必需的,但在需要自定义底层文件打开逻辑时可能会很有用
  41. # 5.返回值:一个文件对象(file object),也被称为文件句柄(file handle)
  42. # 6.说明:
  43. # 6-1、文件路径注意需要使用单引号或双引号括起来
  44. # 6-2、使用read()方法读取文件内容时,如果文件大于可用内存,则不能实现文件的读取,而是返回空字符串
  45. # 6-3、使用tell()方法返回的位置与为read()方法指定的size参数不同. tell()方法返回的不是字符的个数,而是字节数,其中汉字所占的字节数根据其采用的
  46. # 编码有所不同,如果采用GBK编码,则一个汉字按两个字符计算;如果采用UTF-8编码,则一个汉字按3个字符计算
  47. # 6-4、在指定encoding参数时,指定的编码一定是文件采用的编码,否则将抛出异常
  48. # 7.示例:
  49. # 用dir()函数获取该函数内置的属性和方法
  50. print(dir(open))
  51. # ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
  52. # '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
  53. # '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
  54. # '__str__', '__subclasshook__', '__text_signature__']
  55. # 用help()函数获取该函数的文档信息
  56. help(open)
  57. # 应用一:读取文件内容
  58. # 示例1:读取整个文件内容
  59. # 使用 'with' 语句打开文件
  60. with open('file.txt', 'r') as file:
  61. content = file.read() # 读取文件全部内容
  62. print(content)
  63. # 不需要显式调用 file.close(),因为 'with' 语句会自动处理
  64. # 121314536273838390
  65. # 123A
  66. # 456B
  67. # 789C
  68. # 587
  69. # 1024
  70. # 示例2:逐行读取文件
  71. # 使用 'with' 语句打开文件
  72. with open('file.txt', 'r') as file:
  73. for line in file: # 逐行读取文件
  74. print(line, end='') # 打印每一行内容,end='' 用来避免默认的换行符
  75. # 同样,'with' 语句会自动关闭文件
  76. # 121314536273838390
  77. # 123A
  78. # 456B
  79. # 789C
  80. # 587
  81. # 1024
  82. # 示例3:读取指定字节数的文件内容
  83. # 使用 'with' 语句打开文件,并指定读取的字节数
  84. with open('file.txt', 'rb') as file: # 'rb' 模式用于二进制读取
  85. content = file.read(10) # 读取前10个字节
  86. print(content)
  87. # 注意:如果文件内容不是二进制数据(如文本),这种方式可能导致输出不可读
  88. # b'1213145362'
  89. # 示例4:跳过文件的开头部分并读取
  90. with open('file.txt', 'r') as file:
  91. # 跳过开头的10个字符(或字节,在文本模式下)
  92. # 注意:在文本模式下,这可能不是完全准确的10个字符,因为编码问题
  93. file.seek(10)
  94. content = file.read() # 从第10个字符之后开始读取
  95. print(content)
  96. # 'with' 语句结束时文件会被关闭
  97. # 73838390
  98. # 123A
  99. # 456B
  100. # 789C
  101. # 587
  102. # 1024
  103. # 示例5:读取文件并处理每行内容(使用列表推导式)
  104. # 使用 'with' 语句打开文件,并使用列表推导式处理每行内容
  105. with open('file.txt', 'r') as file:
  106. lines = [line.strip() for line in file] # 去除每行首尾的空白字符,并将结果存储到列表中
  107. print(lines)
  108. # 文件在 'with' 语句结束时被关闭,lines 列表包含了处理后的行内容
  109. # ['121314536273838390', '123A', '456B', '789C', '587', '1024']
  110. # 应用二:写入文件内容
  111. # 示例1:写入整个字符串到文件
  112. # 使用 'with' 语句打开文件,如果不存在则创建
  113. with open('test.txt', 'w') as file:
  114. file.write('Hello, World!') # 写入字符串到文件
  115. # 'with' 语句结束时文件会被自动关闭
  116. # 示例2:写入多行内容到文件
  117. # 使用 'with' 语句打开文件
  118. with open('test.txt', 'w') as file:
  119. file.write('I am Myelsa.\n') # 写入第一行并添加换行符
  120. file.write('I love Python very much.\n') # 写入第二行并添加换行符
  121. # 文件在 'with' 语句结束时被关闭
  122. # 示例3:写入列表中的每一行到文件
  123. lines = ['Myelsa', 'Jimmy', 'Bruce']
  124. # 使用 'with' 语句打开文件
  125. with open('test.txt', 'w') as file:
  126. for line in lines:
  127. file.write(line + '\n') # 写入每一行并添加换行符
  128. # 文件在 'with' 语句结束时被关闭
  129. # 示例4:追加内容到文件
  130. # 使用 'a' 模式打开文件,用于追加内容
  131. with open('test.txt', 'a') as file:
  132. file.write('Myelsa love Python very much.\n') # 追加内容到文件末尾
  133. # 文件在 'with' 语句结束时被关闭
  134. # 示例5:写入二进制数据到文件
  135. data = b'\x00\x01\x02\x03\x04' # 二进制数据
  136. # 使用 'wb' 模式打开文件用于二进制写入
  137. with open('example.bin', 'wb') as file:
  138. file.write(data) # 写入二进制数据到文件
  139. # 文件在 'with' 语句结束时被关闭
  140. # 应用三:处理二进制文件
  141. # 示例1:读取二进制文件
  142. # 使用 'rb' 模式打开二进制文件用于读取
  143. with open('example.bin', 'rb') as file:
  144. binary_data = file.read() # 读取整个文件作为二进制数据
  145. # 处理二进制数据,例如打印前10个字节的十六进制表示
  146. print(binary_data[:10].hex())
  147. # 文件在 'with' 语句结束时被关闭
  148. # 0001020304
  149. # 示例2:写入二进制数据到文件
  150. # 二进制数据,这里我们使用一个简单的字节字符串作为示例
  151. binary_data = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09'
  152. # 使用 'wb' 模式打开二进制文件用于写入
  153. with open('example.bin', 'wb') as file:
  154. file.write(binary_data) # 写入二进制数据到文件
  155. # 文件在 'with' 语句结束时被关闭
  156. # 示例3:逐块读取大文件
  157. chunk_size = 1024 # 设置每次读取的块大小为1024字节
  158. # 使用 'rb' 模式打开二进制文件用于读取
  159. with open('example.bin', 'rb') as file:
  160. while True:
  161. chunk = file.read(chunk_size) # 读取一个块的数据
  162. if not chunk: # 如果返回空字节串,表示已经到达文件末尾
  163. break
  164. # 在这里处理你的块数据,例如打印或处理
  165. print(chunk.hex())
  166. # 文件在 'with' 语句结束时被关闭
  167. # 00010203040506070809
  168. # 示例4:修改二进制文件
  169. # 使用 'rb' 模式打开原始二进制文件用于读取
  170. with open('example.bin', 'rb') as file:
  171. binary_data = file.read() # 读取整个文件作为二进制数据
  172. # 修改二进制数据,例如将前4个字节设置为0xFF, 0xFF, 0xFF, 0xFF
  173. binary_data = b'\xFF\xFF\xFF\xFF' + binary_data[4:]
  174. # 使用 'wb' 模式打开一个新文件用于写入修改后的数据
  175. with open('modified_binary_file.bin', 'wb') as file:
  176. file.write(binary_data) # 写入修改后的二进制数据到新文件
  177. # 原始文件和新文件现在都有各自的文件句柄,并且都已在 'with' 语句结束时被关闭
  178. # 应用四:逐行读取文件
  179. # 示例1:逐行读取文本文件
  180. # 使用 'with' 语句打开文件,并使用 'r' 模式(默认)来读取文件
  181. with open('test.txt', 'r') as file:
  182. for line in file: # 逐行读取文件
  183. print(line, end='') # 打印每一行内容,end='' 避免默认的换行符(如果你想要保留原文件的换行符,可以去掉 end='')
  184. # 'with' 语句结束时文件会被自动关闭
  185. # Myelsa
  186. # Jimmy
  187. # Bruce
  188. # Myelsa love Python very much.
  189. # 示例2:逐行读取并处理文件内容
  190. total = 0
  191. # 使用 'with' 语句打开文件
  192. with open('file.txt', 'r') as file:
  193. for line in file:
  194. # 去除每行末尾的换行符,并将字符串转换为整数(假设每行只包含一个整数)
  195. number = int(line.strip())
  196. total += number # 累加每行的数字
  197. print(f"The total sum of numbers in the file is: {total}")
  198. # 文件在 'with' 语句结束时被关闭
  199. # The total sum of numbers in the file is: 121314536273841369
  200. # 示例3:逐行读取并跳过空行
  201. # 使用 'with' 语句打开文件
  202. with open('test.txt', 'r') as file:
  203. for line in file:
  204. if line.strip(): # 如果行不是空的(即去除空白字符后还有内容)
  205. print(line, end='') # 打印行内容
  206. # 文件在 'with' 语句结束时被关闭
  207. # Myelsa
  208. # Jimmy
  209. # Bruce
  210. # Myelsa love Python very much.
  211. # 应用五:文件搜索和替换
  212. # 原始文件和目标文件可以是同一个文件,但这样操作会有风险,建议先写入临时文件再替换
  213. original_file = 'file.txt'
  214. # 如果要将结果写回到原文件,可以注释掉下面这行,并在最后将临时文件重命名为原文件名
  215. temp_file = 'test.txt'
  216. # 要搜索的字符串
  217. search_string = '1'
  218. # 要替换成的字符串
  219. replace_string = 'm'
  220. # 使用 'with' 语句打开原始文件以读取内容,同时打开临时文件以写入修改后的内容
  221. with open(original_file, 'r', encoding='utf-8') as file, open(temp_file, 'w', encoding='utf-8') as temp:
  222. for line in file:
  223. # 替换文件中的字符串
  224. new_line = line.replace(search_string, replace_string)
  225. # 将替换后的行写入到临时文件中
  226. temp.write(new_line)
  227. # 如果需要将结果写回到原文件,删除原文件并将临时文件重命名为原文件名
  228. import os
  229. if original_file != temp_file:
  230. os.remove(original_file) # 删除原文件
  231. os.rename(temp_file, original_file) # 重命名临时文件为原文件名
  232. print(f"Search and replace operation completed in {original_file}")
  233. # 应用六:配置和数据存储
  234. # 示例1:写入JSON数据到文件
  235. # 要写入的数据
  236. data = {
  237. "name": "John Doe",
  238. "age": 30,
  239. "city": "New York"
  240. }
  241. # 使用 'w' 模式打开文件以写入内容
  242. with open('data.json', 'w') as data_file:
  243. # 将Python字典写入文件为JSON格式
  244. json.dump(data, data_file)
  245. # data.json 文件现在包含了写入的数据
  246. # 示例2:读取和写入INI配置文件
  247. import configparser
  248. # 读取INI配置文件
  249. config = configparser.ConfigParser()
  250. config.read('config.ini')
  251. # 访问配置项
  252. print(config['section_name']['setting_name'])
  253. # 写入INI配置文件
  254. config['new_section'] = {'new_setting': 'new_value'}
  255. with open('config.ini', 'w') as config_file:
  256. config.write(config_file)
  257. # config.ini 文件现在包含了新的配置项
  258. # 示例3:读取和写入CSV文件
  259. import csv
  260. # 读取CSV文件
  261. with open('data.csv', 'r', newline='') as csv_file:
  262. reader = csv.reader(csv_file)
  263. for row in reader:
  264. print(row)
  265. # 写入CSV文件
  266. data = [['Name', 'Age'], ['Myelsa', 18], ['Bruce', 6]]
  267. with open('data.csv', 'w', newline='') as csv_file:
  268. writer = csv.writer(csv_file)
  269. writer.writerows(data)
  270. # data.csv 文件现在包含了写入的数据
  271. # 应用七:文件锁定和并发访问
  272. import fcntl
  273. import os
  274. def lock_file(file_path):
  275. # 打开文件,以写入模式(这会创建文件如果它不存在)
  276. with open(file_path, 'w+') as file_obj:
  277. # 尝试获取独占锁(写锁)
  278. try:
  279. fcntl.flock(file_obj, fcntl.LOCK_EX | fcntl.LOCK_NB)
  280. print(f"文件 {file_path} 已锁定")
  281. # 在这里进行文件操作,如读写等
  282. # ...
  283. except IOError:
  284. print(f"无法锁定文件 {file_path},可能已被其他进程锁定")
  285. finally:
  286. # 释放锁
  287. fcntl.flock(file_obj, fcntl.LOCK_UN)
  288. # 使用示例
  289. lock_file('example.lock')
  290. # 应用八:临时文件处理
  291. # 示例1:创建临时目录
  292. import tempfile
  293. import os
  294. # 创建一个临时目录
  295. with tempfile.TemporaryDirectory() as temp_dir:
  296. print(f"临时目录已创建:{temp_dir}")
  297. # 在临时目录中创建一个文件
  298. with open(os.path.join(temp_dir, 'file_1.txt'), 'w') as f:
  299. f.write('这是一个在临时目录中的文件\n')
  300. # 你可以在这里做其他与临时目录相关的操作
  301. # 临时目录在with块结束后会被自动删除
  302. # 临时目录已创建:C:\Users\Administrator\AppData\Local\Temp\tmp_v1na9w7
  303. # 应用九:与标准输入/输出交互
  304. # 示例1:重定向标准输入/输出
  305. import sys
  306. # 将标准输出重定向到一个文件
  307. with open('file.txt', 'w') as f:
  308. sys.stdout = f # 现在print将写入到文件而不是控制台
  309. print("这条消息将被写入到file.txt")
  310. # 恢复标准输出到控制台
  311. sys.stdout = sys.__stdout__
  312. print("Myelsa love Python very much.")
  313. # Myelsa love Python very much.
  314. # 应用十:文件备份与恢复
  315. # 示例1:备份文件
  316. def backup_file(source_file, backup_file):
  317. try:
  318. with open(source_file, 'rb') as source, open(backup_file, 'wb') as backup:
  319. backup.write(source.read())
  320. print(f"文件 {source_file} 已成功备份到 {backup_file}")
  321. except FileNotFoundError:
  322. print(f"文件 {source_file} 不存在,无法备份。")
  323. except Exception as e:
  324. print(f"备份文件时发生错误:{e}")
  325. # 使用示例
  326. backup_file('original.txt', 'original_backup.txt')
  327. # 示例2:恢复文件
  328. def restore_file(backup_file, source_file):
  329. try:
  330. with open(backup_file, 'rb') as backup, open(source_file, 'wb') as source:
  331. source.write(backup.read())
  332. print(f"文件 {source_file} 已成功从 {backup_file} 恢复。")
  333. except FileNotFoundError:
  334. print(f"备份文件 {backup_file} 不存在,无法恢复。")
  335. except PermissionError:
  336. print(f"没有权限写入文件 {source_file},无法恢复。")
  337. except Exception as e:
  338. print(f"恢复文件时发生错误:{e}")
  339. # 使用示例(假设你已经备份了original.txt)
  340. # 警告:这将会覆盖原始文件!确保这是你想要的。
  341. restore_file('original_backup.txt', 'original.txt')
  342. # 应用十一:文件加密和解密
  343. # 示例1:加密文件
  344. from cryptography.fernet import Fernet
  345. import os
  346. def encrypt_file(input_filename, output_filename, key):
  347. cipher_suite = Fernet(key)
  348. with open(input_filename, "rb") as file:
  349. # 读取文件内容
  350. data = file.read()
  351. # 加密文件内容
  352. encrypted_data = cipher_suite.encrypt(data)
  353. with open(output_filename, "wb") as file:
  354. # 写入加密后的内容
  355. file.write(encrypted_data)
  356. # 示例使用
  357. key = Fernet.generate_key() # 生成一个随机的密钥,实际应用中需要安全地存储这个密钥
  358. encrypt_file('input.txt', 'encrypted.txt', key)
  359. print("文件已加密并保存为 encrypted.txt")
  360. # 示例2:解密文件
  361. from cryptography.fernet import Fernet
  362. def decrypt_file(input_filename, output_filename, key):
  363. cipher_suite = Fernet(key)
  364. with open(input_filename, "rb") as file:
  365. # 读取加密的文件内容
  366. encrypted_data = file.read()
  367. # 解密文件内容
  368. decrypted_data = cipher_suite.decrypt(encrypted_data)
  369. with open(output_filename, "wb") as file:
  370. # 写入解密后的内容
  371. file.write(decrypted_data)
  372. # 示例使用,使用与加密时相同的密钥
  373. decrypt_file('encrypted.txt', 'decrypted.txt', key)
  374. print("文件已解密并保存为 decrypted.txt")
  375. # 应用十二:文件传输
  376. import os
  377. import shutil
  378. def copy_file(source_path, destination_path):
  379. # 检查源文件是否存在
  380. if not os.path.exists(source_path):
  381. print(f"源文件 {source_path} 不存在。")
  382. return
  383. # 检查目标目录是否存在,如果不存在则创建
  384. if not os.path.exists(os.path.dirname(destination_path)):
  385. os.makedirs(os.path.dirname(destination_path))
  386. # 使用shutil库复制文件,但为了模拟使用open()函数,我们手动实现
  387. try:
  388. with open(source_path, 'rb') as source_file, open(destination_path, 'wb') as destination_file:
  389. # 读取源文件内容并写入目标文件
  390. while True:
  391. data = source_file.read(1024) # 每次读取1024字节
  392. if not data:
  393. break
  394. destination_file.write(data)
  395. print(f"文件已成功从 {source_path} 传输到 {destination_path}")
  396. except Exception as e:
  397. print(f"文件传输过程中发生错误:{e}")
  398. # 使用示例
  399. source_file = 'path/to/source/file.txt'
  400. destination_file = 'path/to/destination/file.txt'
  401. copy_file(source_file, destination_file)
  402. # 应用十三:文本处理和数据分析
  403. import csv
  404. # 假设CSV文件有两列:姓名,年龄
  405. total_age = 0
  406. age_count = 0
  407. min_age = float('inf') # 初始化为正无穷大
  408. max_age = float('-inf') # 初始化为负无穷大
  409. with open('data.csv', 'r', encoding='utf-8', newline='') as csvfile:
  410. reader = csv.reader(csvfile)
  411. next(reader, None) # 跳过表头(如果有的话)
  412. for row in reader:
  413. name, age_str = row # 假设CSV中没有其他额外的列或空值
  414. try:
  415. age = int(age_str) # 转换年龄为整数
  416. total_age += age
  417. age_count += 1
  418. if age < min_age:
  419. min_age = age
  420. if age > max_age:
  421. max_age = age
  422. except ValueError:
  423. print(f"无法解析年龄:{age_str}(跳过此行)")
  424. # 计算平均年龄
  425. average_age = total_age / age_count if age_count > 0 else 0
  426. # 输出结果
  427. print(f"总年龄:{total_age}")
  428. print(f"年龄数量:{age_count}")
  429. print(f"最小年龄:{min_age}")
  430. print(f"最大年龄:{max_age}")
  431. print(f"平均年龄:{average_age}")
  432. # 应用十四:文件映射
  433. # 创建一个颜色到RGB值的映射字典
  434. color_to_rgb = {
  435. 'red': '(255, 0, 0)',
  436. 'green': '(0, 255, 0)',
  437. 'blue': '(0, 0, 255)',
  438. # ... 其他颜色
  439. }
  440. # 打开文本文件以进行读取和写入(由于我们将覆盖原文件,所以需要写入权限)
  441. with open('colors.txt', 'r', encoding='utf-8') as file, open('colors_mapped.txt', 'w', encoding='utf-8') as outfile:
  442. # 逐行读取文本文件
  443. for line in file:
  444. # 对每一行进行文本映射(替换颜色名称)
  445. for color, rgb in color_to_rgb.items():
  446. line = line.replace(color, rgb)
  447. # 将映射后的行写入新的文件
  448. outfile.write(line)
  449. # 现在'colors_mapped.txt'文件包含了映射后的颜色值
  450. # 应用十五:监视文件变化(使用watchdog替代方案)
  451. import time
  452. from watchdog.observers import Observer
  453. from watchdog.events import FileSystemEventHandler
  454. class MyHandler(FileSystemEventHandler):
  455. def on_modified(self, event):
  456. if not event.is_directory:
  457. print(f"文件 {event.src_path} 已被修改")
  458. # 你还可以添加其他事件处理方法,如 on_created, on_deleted, on_moved 等
  459. if __name__ == "__main__":
  460. path_to_watch = "/path/to/directory" # 替换为你想要监视的目录路径
  461. event_handler = MyHandler()
  462. observer = Observer()
  463. observer.schedule(event_handler, path_to_watch, recursive=True) # recursive=True 表示递归监视子目录
  464. observer.start()
  465. try:
  466. while True:
  467. time.sleep(1) # 保持主线程活跃,以便监视器可以运行
  468. except KeyboardInterrupt:
  469. observer.stop()
  470. observer.join()
  471. # 应用十六:网络文件和特殊设备
  472. # 示例1:处理网络文件(例如,通过HTTP下载文件)
  473. import requests
  474. def download_file_from_url(url, save_path):
  475. response = requests.get(url, stream=True)
  476. if response.status_code == 200:
  477. with open(save_path, 'wb') as f:
  478. for chunk in response.iter_content(chunk_size=8192):
  479. f.write(chunk)
  480. else:
  481. print(f"Failed to download file, status code: {response.status_code}")
  482. # 使用示例
  483. url = 'http://example.com/somefile.txt'
  484. save_path = 'local_copy_of_somefile.txt'
  485. download_file_from_url(url, save_path)
  486. # 示例2:处理特殊设备(例如,通过串口通信读取数据)
  487. # 对于特殊设备(如串口设备),你可以使用pySerial库
  488. import serial
  489. def read_from_serial_port(port, baudrate):
  490. ser = serial.Serial(port, baudrate, timeout=1)
  491. if ser.isOpen():
  492. print('Serial port is open.')
  493. data = ser.readline().decode('utf-8').rstrip() # 读取一行数据并解码
  494. print('Received:', data)
  495. ser.close() # 关闭串口
  496. else:
  497. print('Unable to open serial port')
  498. # 使用示例
  499. port = '/dev/ttyUSB0' # 对于Linux系统,串口可能类似于/dev/ttyUSB0或/dev/ttyS0
  500. baudrate = 9600
  501. read_from_serial_port(port, baudrate)
  502. # 示例3:处理网络文件系统(例如,通过SSH/SFTP访问远程文件)
  503. # 对于网络文件系统,如SSH或SFTP,你可以使用paramiko库
  504. import paramiko
  505. def sftp_get_file(hostname, port, username, password, remote_path, local_path):
  506. ssh = paramiko.SSHClient()
  507. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动添加主机名及主机密钥到本地HostKeys对象,并保存
  508. ssh.connect(hostname, port, username, password)
  509. sftp = ssh.open_sftp()
  510. sftp.get(remote_path, local_path) # 从远程路径下载文件到本地路径
  511. sftp.close()
  512. ssh.close()
  513. # 使用示例
  514. hostname = 'remote.example.com'
  515. port = 22
  516. username = 'your_username'
  517. password = 'your_password'
  518. remote_path = '/path/to/remote/file.txt'
  519. local_path = '/path/to/local/file.txt'
  520. sftp_get_file(hostname, port, username, password, remote_path, local_path)
1-2、VBA:
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-object基类

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:神奇夜光杯-CSDN博客 
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60891 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/138461696"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top