输入用","分隔的多个整数,将其升序排序后写入文本文件"ps14t1.txt"。如果写入成功,则输出"succeed"。如果输入无效数据或写入失败,则输出"failed"。
要求:
1、数据采用"UTF-16"编码写入文件。
2、程序保存到:s14t1.py
3、程序执行效果:
输入整数序列:12,31,27,16,8
输出:succeed
【参考与提示】
写数据到文本文件的一般步骤:
1、open函数打开文件。需传递3个参数:
(1)file:文本文件名(含路径)。
(2)mode:打开模式,必须是"w"。
(3)encoding:使用的编码。
2、写数据到文件。使用文件对象的内置函数write。注意:数据需转换为字符串。
3、使用文件对象的内置函数close关闭文件。
try:
s = input("输入整数序列:")
nums = s.split(',')
nums = [int(num) for num in nums]
nums = sorted(nums)
t = ','.join(map(str, nums))
## t = str(nums).replace(" ","")[1:-1]
# 以写入模式("w")打开文件"ps14t1.txt",并指定编码为UTF-16
# 使用with语句自动管理文件资源,文件操作完成后会自动关闭
with open("ps14t1.txt", "w", encoding="UTF-16") as file:
file.write(t)
print("succeed")
except:
print("failed")
任务2 文件处理-从文本文件读取数据
从文件ps14t2A.txt中读取全部整数并保存到列表a中。再根据输入的整数n输出a中大于n的最小整数。如果输入无效数据,则约定n=60。如果a中不存在大于n的整数,则输出"None"。
要求:
1、先通过记事本浏览文件,确定数据编码方式和数据存储特点,再在代码中使用该编码打开文件。
2、程序保存到:s14t2.py
3、程序执行效果:
输入整数:82
输出:min=83
【参考与提示】
1、使用记事本打开文件后,单击“文件”菜单“另存为”命令,可打开“另存为”对话框。在该对话框正下方可查看编码。
2、使用文件对象的内置函数:
(1)read( ):读取全部数据。
(2)readline( ):读取一行数据。
(3)readlines( ):读取全部行数据。
注:以上函数均是从当前读取位置开始读取数据。
示例(f是以"r"模式打开的文件对象):
s=f.readline( ) #先读取一行
a=f.readlines( ) #再读取其他行
try:
# 以UTF-8编码打开文件并读取全部内容
with open('ps14t2A.txt', 'r', encoding='utf-8') as f:
content = f.read( ) # 读取文件全部内容为一个字符串
# 将字符串按逗号分割成多个子字符串,并转换为整数列表
a = list(map(int, content.split(',')))
except:
a = [ ] # 若文件读取失败或内容无法转换为整数,重置列表为空
try:
n = int(input("输入整数:"))
except:
n = 60
greater = [x for x in a if x > n]
if greater:
print(f"min={min(greater)}")
else:
print("None")
任务3 文件处理-数据写入二进制文件
输入一个字符串,将其转换为"GB18030"编码的字节串后写入文件ps14t3.ytt。如果写入成功,输出"T"。否则输出"F"。
要求:
1、程序保存到:s14t3.py
3、程序执行效果:
输入字符串:82ugood99
输出:T
【参考与提示】
1、使用open函数创建二进制文件对象时,模式必须设置为"wb"才能写入数据。
2、字符串的内置函数encode可返回指定编码后的字节串。
s = input("输入字符串:")
try:
bytes_data = s.encode('GB18030') # 将字符串编码为GB18030字节数据
with open('ps14t3.ytt', 'wb') as f: # 以二进制写入模式打开文件并写入数据
f.write(bytes_data)
print("T")
except:
print("F")
任务4 文件处理-从二进制文件读数据
已知文件ps14t4A.tuw中的数据(用","分隔的整数序列)是通过ANSI编码后写入的字节串。读取这些整数,输出它们的最大值与n的和。其中n从键盘输入。如果输入数据无效,则约定n=100。
要求:
1、程序保存到:s14t4.py
3、程序执行效果:
输入整数:82
输出:sum=178
【参考与提示】
1、使用open函数创建二进制文件对象时,模式必须设置为"wb"才能写入数据。
2、字符串的内置函数encode可返回指定编码后的字节串。
max_num = 0
try:
with open('ps14t4A.tuw', 'rb') as f:
content = f.read( ).decode('GBK') # 读取字节数据并用GBK解码为字符串
nums = list(map(int, content.split(',')))
max_num = max(nums)
n = int(input("输入整数:"))
except:
n = 100
print(f"sum={max_num + n}")
任务5 文件处理-二进制文件综合应用
定义函数pwd(file),能够对任意文件进行加密。对用该函数加密的文件也可调用该 函数解密。并利用以下代码调试该函数。加密方法:取文件的前10个字节(文件不足10个字节时取其全部字节)得到字节串s。s[k]与元组a=(163,182,213,175,207,192)的元素a[k%6]按位异或。k=0,1,2,...。
s=input("输入文件名:")
if(pwd(s)):print("Finished")
else:print("Failed")
要求:
1、程序保存到:s14t5.py
3、程序执行效果:
输入文件名:d:\\ps14t5.png
输出:Finished
【参考与提示】
求解思路:
1、以"rb+"模式打开文件。
2、使用文件对象的seek函数将读写位置移到文件尾。
3、使用文件对象的tell函数得到文件大小。
4、根据文件大小确定应读取的字节数n。
5、将读写位置定位到文件头。
6、读取n个字节的数据,得到字节串s。
7、利用列表推导式对s加密,得到列表b。
8、将读写位置定位到文件头。
9、将b转换为字节串后写入文件。
def pwd(file):
a = (163, 182, 213, 175, 207, 192) # 异或操作的密钥元组
try:
with open(file, 'rb+') as f: # 以读写模式打开二进制文件
f.seek(0, 2) # 移动指针到文件末尾
size = f.tell( ) # 获取文件总字节数
n = min(10, size) # 确定读取前n个字节(最多10字节)
if n == 0: # 处理空文件情况
return True
f.seek(0) # 回到文件开头读取数据
s = f.read(n) # 读取前n个字节
# 生成加密/解密后的字节列表(异或运算可逆)
encrypted = bytes([s[k] ^ a[k % 6] for k in range(n)])
f.seek(0) # 回到文件开头准备写入
f.write(encrypted) # 覆盖写入处理后的字节
return True
except Exception:
return False # 操作失败标志
s = input("输入文件名:")
# 调用pwd函数进行加密/解密,并输出结果
if pwd(s):
print("Finished")
else:
print("Failed")

