第3章 Python基础-文件操作&函数 文件操作 练习题
一.利用b模式,编写一个cp工具,要求如下:
1. 既可以拷贝文本又可以拷贝视频,图片等文件
2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file
提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# cp工具
import sys
if len(sys.argv) != 3:
print("usage: cp source_file target_file")
sys.exit()
else:
source_file, target_file = sys.argv[1], sys.argv[2]
with open(source_file,"rb") as read_f,open(target_file,"wb") as write_f:
for line in read_f:
write_f.write(line)
二.Python实现 tail -f 功能
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#tail -f工具
import sys,time
if len(sys.argv) != 2:
print("usage: tail file_name")
sys.exit()
else:
file_name = sys.argv[1]
with open(file_name,'rb') as f:
f.seek(0,2) # 每次都从文件末尾开始读
while True:
line = f.readline()
if line:
print(line.decode('utf-8'),end='') # 读取的每一行都去掉行尾的换行符
time.sleep(1)
有待优化,每次打开应该显示最后10行。
https://www.cnblogs.com/shengxinjing/p/5397145.html
三.文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f:
line=line.replace('alex','SB')
write_f.write(line) os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
三.全局替换程序:
写一个脚本,允许用户按以下方式执行时,即可以对指定文件内容进行全局替换
- 替换完毕后打印替换了多少处内容
#!/usr/bin/env python3
# -*- coding:utf-8 -*- import sys
import os if len(sys.argv) != 4:
print("usage: python3 replace old_str new_str filename")
sys.exit()
else:
old_str = sys.argv[1]
new_str = sys.argv[2]
filename = sys.argv[3]
filename_swap = sys.argv[3] + ".swap"
with open(filename,"r",encoding="utf-8") as read_f,open(filename_swap,"w",encoding="utf-8") as write_f:
count = 0
for line in read_f:
line = line.replace(old_str,new_str)
write_f.write(line)
num = line.count(new_str)
count += 1
totle = count * num
print("一共替换了%s处内容" % totle)
os.remove(filename)
os.rename(filename_swap,filename)
四.模拟登陆:
- 用户输入帐号密码进行登陆
- 用户信息保存在文件内
- 用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了
user_list.txt
wss:123:1
alex:456:1
jay:789:1
#!/usr/bin/env python3
# -*- encoding: utf8 -*- import getpass
import os user_dict = {}
with open("user_list.txt", "r", encoding="utf-8") as user_list_flie:
for line in user_list_flie.readlines():
user_list = line.strip().split(":")
# print(user_list)
_user = user_list[0].strip()
_pwd = user_list[1].strip()
_lockaccount = int(user_list[2].strip())
user_dict[_user] = {"user": _user, "pwd": _pwd, "lockaccount": _lockaccount}
# print(user_dict[_username])
# print(user_dict) exit_flag = False
count = 0
while count < 3 and not exit_flag:
user = input('\n请输入用户名:')
if user not in user_dict:
count += 1
print("\n用户名错误")
elif user_dict[user]["lockaccount"] > 0:
print("\n用户已被锁定,请联系管理员解锁后重新尝试")
break
else:
while count < 3 and not exit_flag:
pwd = getpass.getpass('\n请输入密码:')
# pwd = input('\n请输入密码:')
if pwd == user_dict[user]["pwd"]:
print('\n欢迎登陆')
print('..........')
exit_flag = True
else:
count += 1
print('\n密码错误')
continue
if count >= 3: # 尝试次数大于等于3时锁定用户
if user == "":
print("\n您输入的错误次数过多,且用户为空")
elif user not in user_dict:
print("\n您输入的错误次数过多,且用户 %s 不存在" % user)
else:
user_dict[user]["lockaccount"] += 1
# print(user_dict[user]["lockaccount"])
with open("user_list.txt", "r", encoding="utf-8") as user_list_file, open("use_list.txt.swap", "w",encoding="utf-8") as new_user_list_file:
for new_line in user_dict:
new_user_list = [str(user_dict[new_line]["user"]), str(user_dict[new_line]["pwd"]),
str(user_dict[new_line]["lockaccount"])]
# print(new_user_list)
user_str = ":".join(new_user_list)
print(user_str)
new_user_list_file.write(user_str + "\n")
os.remove("user_list.txt")
os.rename("use_list.txt.swap", "user_list.txt")
print("\n您输入的错误次数过多,%s 已经被锁定" % user)
第3章 Python基础-文件操作&函数 文件操作 练习题的更多相关文章
- [Python笔记][第一章Python基础]
2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...
- python基础——内置函数
python基础--内置函数 一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highl ...
- python学习第五讲,python基础语法之函数语法,与Import导入模块.
目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- python基础——高阶函数
python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- python基础之元组、文件操作、编码、函数、变量
1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...
- Python-Day3 Python基础进阶之集和/文件读写/函数
一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...
- Python基础(七)-文件操作
一.文件处理流程 1.打开文件,得到文件句柄赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 二.基本操作 f = open('zhuoge.txt') #打开文件 first_line = ...
随机推荐
- android中LitePal的使用
网上有一篇文章写的挺好的,推荐给大家:安卓项目实战之:数据库框架 LitePal 3.0 的使用详解 LitePal是对SQLite数据库操作进行了封装,采用对象映射的方式操作SQLite数据库,简化 ...
- LintCode: Convert Sorted Array to Binary Search Tree With Minimal Height
C++ /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; ...
- IDEA中Gradle插件的使用
Idea本身已经集成了Gradle插件,你可以在File | Settings | Build, Execution, Deployment | Build Tools | Gradle 下找到 相关 ...
- 算法笔记_201:第三届蓝桥杯软件类决赛真题(Java本科)
目录 1 数量周期 2 提取子串 3 源码变换 4 古代赌局 5 火柴游戏 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简 ...
- 代码实现分析mpeg-2文件
1.概述 把上一篇文章中讲到的mpeg-2文件结构分析用代码实现,结合mpeg-2文件分析.才easy看懂. 2.代码 /* *本程序主要分析MPEG-2文件 *作者:缪国凯(MK) *8214860 ...
- React Native中常用ES6语法
一:模块导入导出 //ES6 import React, { Component, PropTypes, } from 'react'; import { Image, Text } from 're ...
- ES6学习笔记十:模块的导入、导出
一:模块导入 1) import { 要导入的属性.方法民 } from '模块路径'; 2)该种方法需要有配置文件,指明模块所在路径 import { 要导入的属性.方法民 } from '模块名' ...
- C/C++中extern关键字详解(转)
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- 【Linux】文件夹及作用说明
Tips Linux关机注意事项: 远程重启服务前,先停止相关服务 使用安全命令重启shutdown –r now,该命令在重启时会正常保存和终止服务器上正在运行的程序 不建议在本地直接对远程服务器关 ...
- C#和JAVA的RSA密钥、公钥转换
C#的秘钥跟JAVA的密钥区别 RSA对于程序本身是没有区别的,其格式都是相同的.对于不同的程序来说,存储使用的语法(包装的类)会有所不同. RSA语法和语法标准有很多,大的类型大概分为ASN.1 ...