“Python文本处理”的版本间的差异
(→Python编码解码) |
(→读写配置文件) |
||
(未显示2个用户的18个中间版本) | |||
第1行: | 第1行: | ||
==Python编码解码== | ==Python编码解码== | ||
+ | utf-8编码: | ||
+ | |||
<nowiki>str = "我是中国人" | <nowiki>str = "我是中国人" | ||
print(f'Unicode字符串为"{str}"') | print(f'Unicode字符串为"{str}"') | ||
第8行: | 第10行: | ||
</nowiki> | </nowiki> | ||
+ | |||
+ | gbk编码: | ||
<nowiki> | <nowiki> | ||
第20行: | 第24行: | ||
==Python文件读写== | ==Python文件读写== | ||
− | + | ===读写方式=== | |
+ | f = open("maxin.txt","读写格式",encoding="编码") | ||
+ | |||
+ | f.read()/f.write() | ||
+ | |||
+ | f.close() | ||
+ | |||
+ | 读写格式: | ||
+ | |||
+ | ‘r’:只读。该文件必须已存在。 | ||
+ | |||
+ | ‘r+’:可读可写。该文件必须已存在,写为追加在文件内容末尾。 | ||
+ | |||
+ | ‘rb’:表示以二进制方式读取文件。该文件必须已存在。 | ||
+ | |||
+ | ‘w’:只写。打开即默认创建一个新文件,如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。 | ||
+ | |||
+ | ‘w+’:写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写。 | ||
+ | |||
+ | ‘wb’:表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。 | ||
− | + | ‘a’:追加写。若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。 | |
− | |||
− | + | ‘a+’:追加读写。打开文件方式与写入方式和'a'一样,但是可以读。需注意的是你若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。 | |
− | |||
− | |||
+ | ===w:清空写入=== | ||
<nowiki># -*- coding: utf-8 -*- | <nowiki># -*- coding: utf-8 -*- | ||
− | f = open(" | + | f = open("maxin.txt","w",encoding="utf-8") |
− | f.write(" | + | f.write("我爱自动化运维.\n") |
+ | f.write("我爱网络行业..\n") | ||
+ | f.write("hello world\n") | ||
f.close() | f.close() | ||
− | f = open(" | + | </nowiki> |
+ | |||
+ | ===a: 追加写入=== | ||
+ | |||
+ | <nowiki> | ||
+ | f = open("maxin.txt", "a", encoding="utf-8") | ||
f.write("测试a方式写入,如果文件存在,在文件内容后最后追加写入,如果文件不存在则创建") | f.write("测试a方式写入,如果文件存在,在文件内容后最后追加写入,如果文件不存在则创建") | ||
− | f.close() | + | f.close()</nowiki> |
− | f = open(" | + | ===t: 以文本形式读文件=== |
+ | <nowiki>f = open("maxin.txt", "rt", encoding="utf-8") | ||
# 以文本方式读,f.read()返回字符串对象 | # 以文本方式读,f.read()返回字符串对象 | ||
data = f.read() | data = f.read() | ||
print(type(data)) | print(type(data)) | ||
print(data) | print(data) | ||
− | f.close() | + | f.close()</nowiki> |
− | f = open(" | + | ===b: 以字节形式读文件=== |
+ | <nowiki>f = open("maxin.txt", "rb") | ||
# 以文本方式读,f.read()返回字节对象 | # 以文本方式读,f.read()返回字节对象 | ||
data = f.read() | data = f.read() | ||
第54行: | 第84行: | ||
print('将读取的字符对象解码:') | print('将读取的字符对象解码:') | ||
print(data.decode('utf-8')) | print(data.decode('utf-8')) | ||
− | f.close() | + | f.close()</nowiki> |
− | </nowiki> | + | |
+ | ===简约写法=== | ||
+ | 简约写法 的好处是 可以不用担心 f.close() 忘了写的问题。 | ||
+ | |||
+ | <nowiki>print(f'以文本方式将Unicode字符串"{str}"写入a.txt') | ||
+ | str="简约写法 的好处是 可以不用担心 f.close() 忘了写的问题" | ||
+ | with open("maxin.txt", "a", encoding="utf-8") as f: | ||
+ | f.write(str) | ||
+ | |||
+ | print("以文本方式读取 maxin.txt 的内容") | ||
+ | with open("maxin.txt", "r", encoding="utf-8") as f: | ||
+ | print(f.read())</nowiki> | ||
+ | |||
+ | ==文件定位== | ||
+ | seek() 方法语法如下: | ||
+ | |||
+ | fileObject.seek(offset[, whence]) | ||
+ | |||
+ | 参数 | ||
+ | |||
+ | offset -- 开始的偏移量,也就是代表需要移动偏移的字节数 | ||
+ | |||
+ | whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 | ||
例:在文件中定位 | 例:在文件中定位 | ||
第65行: | 第117行: | ||
# File Name: seek_file.py | # File Name: seek_file.py | ||
− | f = open(" | + | f = open("maxin.txt", "wb+") |
f.write(b"abcdefghi") | f.write(b"abcdefghi") | ||
f.seek(5) # 移动到文件的第六个字节 | f.seek(5) # 移动到文件的第六个字节 | ||
第78行: | 第130行: | ||
import time | import time | ||
− | with open(' | + | with open('maxin.txt', 'rb') as f: |
f.seek(0, 2) # 将光标移动至文件末尾 | f.seek(0, 2) # 将光标移动至文件末尾 | ||
while True: # 实时显示文件新增加的内容 | while True: # 实时显示文件新增加的内容 | ||
第89行: | 第141行: | ||
当tmp.txt追加新的内容时,新内容会被程序立即打印出来。 | 当tmp.txt追加新的内容时,新内容会被程序立即打印出来。 | ||
+ | |||
+ | 共享文档:可将上述程序改写为共享文档?在一端修改了之后,另一端马上呈现? | ||
+ | |||
+ | ==特殊读写操作== | ||
===大文件读写=== | ===大文件读写=== | ||
普通的小文件读写: | 普通的小文件读写: | ||
+ | |||
+ | 小文件读写的思路是读取文件全部内容、存到字符串变量里,然后把字符串写入原文件。 | ||
<nowiki>import os | <nowiki>import os | ||
第104行: | 第162行: | ||
对大文件进行读写: | 对大文件进行读写: | ||
+ | |||
+ | 大文件读写的思路是对文件内容进行逐行操作,防止内存溢出。 | ||
+ | |||
+ | 大文件读: | ||
+ | |||
+ | <nowiki>import os | ||
+ | with open(r'd:/maxin.txt',encoding="utf-8") as read_f: | ||
+ | for line in read_f:#对可迭代对象f逐行操作,防止内存溢出 | ||
+ | print(line)</nowiki> | ||
+ | |||
+ | 大文件写: | ||
<nowiki>import os | <nowiki>import os | ||
第158行: | 第227行: | ||
写入ini文件: | 写入ini文件: | ||
+ | |||
+ | |||
+ | <nowiki> | ||
+ | import os | ||
+ | import configparser | ||
+ | config =configparser.ConfigParser() | ||
+ | config["global"]={ | ||
+ | "index-url":"https://pypi.doubanio.com/simple/", | ||
+ | |||
+ | } | ||
+ | config["install"]={ | ||
+ | "trusted" :"pypi.doubanio.com", | ||
+ | } | ||
+ | |||
+ | with open("example.ini", "w") as configfile: #将上述配置信息config写入文件example.ini | ||
+ | config.write(configfile)</nowiki> | ||
+ | |||
+ | 例子2: | ||
<nowiki># encoding=utf-8 | <nowiki># encoding=utf-8 | ||
第183行: | 第270行: | ||
print(f.read()) | print(f.read()) | ||
</nowiki> | </nowiki> | ||
+ | |||
===读写XML文件=== | ===读写XML文件=== | ||
− | + | 文件1.xml | |
<nowiki><breakfast_menu year="2018"> | <nowiki><breakfast_menu year="2018"> | ||
第231行: | 第319行: | ||
代码: | 代码: | ||
− | <nowiki> | + | <nowiki> |
import xml.etree.ElementTree as ET | import xml.etree.ElementTree as ET | ||
− | tree = ET.parse(" | + | tree = ET.parse("1.xml") |
root = tree.getroot() | root = tree.getroot() | ||
print(f"这是一个早餐菜单\n{root.attrib['year']}") | print(f"这是一个早餐菜单\n{root.attrib['year']}") |
2023年2月21日 (二) 01:00的最新版本
目录
Python编码解码
utf-8编码:
str = "我是中国人" print(f'Unicode字符串为"{str}"') byte0 = str.encode("utf-8") print(f'Unicode字符串"{str}"以utf-8编码得到字节串[{byte0}]') str0 = byte0.decode("utf-8") print(f'将utf-8字节串[{byte0}]解码得到Unicode字符串"{str0}"')
gbk编码:
byte1 = str.encode("gbk") print(f'Unicode字符串"{str}"以gbk编码得到字节串[{byte1}]') str1 = byte1.decode("gbk") print(f'将gbk字节串[{byte1}]解码得到Unicode字符串"{str1}"')
Python文件读写
读写方式
f = open("maxin.txt","读写格式",encoding="编码")
f.read()/f.write()
f.close()
读写格式:
‘r’:只读。该文件必须已存在。
‘r+’:可读可写。该文件必须已存在,写为追加在文件内容末尾。
‘rb’:表示以二进制方式读取文件。该文件必须已存在。
‘w’:只写。打开即默认创建一个新文件,如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。
‘w+’:写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写。
‘wb’:表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
‘a’:追加写。若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。
‘a+’:追加读写。打开文件方式与写入方式和'a'一样,但是可以读。需注意的是你若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。
w:清空写入
# -*- coding: utf-8 -*- f = open("maxin.txt","w",encoding="utf-8") f.write("我爱自动化运维.\n") f.write("我爱网络行业..\n") f.write("hello world\n") f.close()
a: 追加写入
f = open("maxin.txt", "a", encoding="utf-8") f.write("测试a方式写入,如果文件存在,在文件内容后最后追加写入,如果文件不存在则创建") f.close()
t: 以文本形式读文件
f = open("maxin.txt", "rt", encoding="utf-8") # 以文本方式读,f.read()返回字符串对象 data = f.read() print(type(data)) print(data) f.close()
b: 以字节形式读文件
f = open("maxin.txt", "rb") # 以文本方式读,f.read()返回字节对象 data = f.read() print(type(data)) print(data) print('将读取的字符对象解码:') print(data.decode('utf-8')) f.close()
简约写法
简约写法 的好处是 可以不用担心 f.close() 忘了写的问题。
print(f'以文本方式将Unicode字符串"{str}"写入a.txt') str="简约写法 的好处是 可以不用担心 f.close() 忘了写的问题" with open("maxin.txt", "a", encoding="utf-8") as f: f.write(str) print("以文本方式读取 maxin.txt 的内容") with open("maxin.txt", "r", encoding="utf-8") as f: print(f.read())
文件定位
seek() 方法语法如下:
fileObject.seek(offset[, whence])
参数
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
例:在文件中定位
# -*- coding: utf-8 -*- # !/usr/local/bin/python # Time: 2018/5/23 22:56:26 # Description: # File Name: seek_file.py f = open("maxin.txt", "wb+") f.write(b"abcdefghi") f.seek(5) # 移动到文件的第六个字节 print(f.read(1)) f.seek(-3, 2) # 移动到文件的倒数第三字节 print(f.read(1))
例:基于seek实现类似Linux命令tail -f的功能(文件名为lx_tailf.py)
# encoding=utf-8 import time with open('maxin.txt', 'rb') as f: f.seek(0, 2) # 将光标移动至文件末尾 while True: # 实时显示文件新增加的内容 line = f.read() if line: print(line.decode('utf-8'), end='') else: time.sleep(0.2) # 读取完毕后短暂的睡眠
当tmp.txt追加新的内容时,新内容会被程序立即打印出来。
共享文档:可将上述程序改写为共享文档?在一端修改了之后,另一端马上呈现?
特殊读写操作
大文件读写
普通的小文件读写:
小文件读写的思路是读取文件全部内容、存到字符串变量里,然后把字符串写入原文件。
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() data=data.replace('str1','str2') write_f.write(data) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
对大文件进行读写:
大文件读写的思路是对文件内容进行逐行操作,防止内存溢出。
大文件读:
import os with open(r'd:/maxin.txt',encoding="utf-8") as read_f: for line in read_f:#对可迭代对象f逐行操作,防止内存溢出 print(line)
大文件写:
import os with open('a.txt',encoding="utf-8") as read_f,open('.a.txt.swap','w',encoding="utf-8") as write_f: for line in read_f:#对可迭代对象f逐行操作,防止内存溢出 line=line.replace('中国人','Chinese') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
读写配置文件
配置文件是供程序运行时读取配置信息的文件,用于将配置信息与程序分离,这样做的好处是显而易见的:例如在开源社区贡献自己源代码时,将一些敏感信息通过配置文件读取;提交源代码时不提交配置文件可以避免自己的用户名、密码等敏感信息泄露;我们可以通过配置文件保存程序运行时的中间结果;
Python内置的配置文件解析器模块configparser提供ConfigParser类来解析基本的配置文件,我们可以使用它来编写Python程序,让用户最终通过配置文件轻松定制自己需要的Python应用程序。
建立ini文件:
""" python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini="""[global] index-url = https://pypi.doubanio.com/simple/ [install] trusted-host=pypi.doubanio.com """ pippath=os.environ["USERPROFILE"]+"\\pip\\" if not os.path.exists(pippath): os.mkdir(pippath) with open(pippath+"pip.ini","w+") as f: f.write(ini)
读取ini文件:
# encoding=utf-8 import os import configparser pippath=os.environ["USERPROFILE"]+"\\pip\\" config = configparser.ConfigParser() # 实例化ConfigParser类 config.read(pippath+r"pip.ini") # 读取配置文件 for section in config.sections(): # 首先读取sections print(f"section is [{section}]") for key in config[section]: # 讲到每个section的键和值 print(f"key is [{key}], value is [{config[section][key]}]") # 打印键和值
写入ini文件:
import os import configparser config =configparser.ConfigParser() config["global"]={ "index-url":"https://pypi.doubanio.com/simple/", } config["install"]={ "trusted" :"pypi.doubanio.com", } with open("example.ini", "w") as configfile: #将上述配置信息config写入文件example.ini config.write(configfile)
例子2:
# encoding=utf-8 import configparser config = configparser.ConfigParser() config["DEFAULT"] = { "ServerAliveInterval": "45", "Compression": "yes", "CompressionLevel": "9", } config["bitbucket.org"] = {} config["bitbucket.org"]["User"] = "hg" config["topsecret.server.com"] = {} topsecret = config["topsecret.server.com"] topsecret["Port"] = "50022" # mutates the parser topsecret["ForwardX11"] = "no" # same here config["DEFAULT"]["ForwardX11"] = "yes" #print(type(config["DEFAULT"].getboolean('Compression'))) #print(config["bitbucket.org"]['ServerAliveInterval']) with open("example.ini", "w") as configfile: #将上述配置信息config写入文件example.ini config.write(configfile) with open("example.ini", "r") as f: #读取example.ini 验证上述写入是否正确 print(f.read())
读写XML文件
文件1.xml
<breakfast_menu year="2018"> <food> <name>Belgian Waffles</name> <price>$5.95</price> <description> two of our famous Belgian Waffles with plenty of real maple syrup </description> <calories>650</calories> </food> <food> <name>Strawberry Belgian Waffles</name> <price>$7.95</price> <description> light Belgian waffles covered with strawberries and whipped cream </description> <calories>900</calories> </food> <food> <name>Berry-Berry Belgian Waffles</name> <price>$8.95</price> <description> light Belgian waffles covered with an assortment of fresh berries and whipped cream </description> <calories>900</calories> </food> <food> <name>French Toast</name> <price>$4.50</price> <description> thick slices made from our homemade sourdough bread </description> <calories>600</calories> </food> <food> <name>Homestyle Breakfast</name> <price>$6.95</price> <description> two eggs, bacon or sausage, toast, and our ever-popular hash browns </description> <calories>950</calories> </food> </breakfast_menu>
代码:
import xml.etree.ElementTree as ET tree = ET.parse("1.xml") root = tree.getroot() print(f"这是一个早餐菜单\n{root.attrib['year']}") for child in root: print("name:", child[0].text) print("price:", child[1].text) print("description:", child[2].text) print("calories:", child[3].text)