python3文件读写操作(本篇代码大约100行)

  1. f = open(xxx.txt, "r", encoding="utf-8")  不写“r”(只读)默认是只读方式打开,可以改成“w”(只写,覆盖写,若没有则创建),"a"(只追加写),操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码(win7\8--->gbk,mac/linux---->utf-8),所以为了避乱乱码可以使用encoding="utf-8"
  2. f.read(5)     从开头开始读5个字符,中文和英文数字都算是一个字符
  3. f.write()      多次使用的话就一直在后面写入内容,紧挨着
  4. f.readline()     按行读,读出来之后除了内容还会打印换行符,所以中间还会空一行
  5. f.readlines()    将文件所有行读出来存在列表中,按行存储
  6. for i in f:        这种是常用的循环读取文件内容的办法,因为for循环会把f做成迭代器,这样在读大文件的时候不会像readlines那样直接全部读取到内存中,而是一行一行取,想下面就是读取的时候在第N行需要修改
    f = open("test1.txt", "r", encoding="utf-8")    #以utf-8编码格式打开文件
    n = 0 #设定行数
    for i in f:
    n+=1
    if n == 5: #当读到第五行时,就在第五行后面加上test字符串
    i = ''.join((i,"test"))
    print(i.strip())
    f.close()
  7. f.tell()       返回文件读取目前光标所在的位置(python3中如果是utf-8的中文,一个中文代表三个位置,加入读“刘”,f.read(1)就能读出来了,但是f.tell()会显示3)
  8. f.seek(n,2)      从位置2开始偏移n
  9. f.flush()   方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
    import time,sys
    for i in range(30): #print是默认调用了sys.stdout.write()方法将输出打印到控制台
    sys.stdout.write("*") #sys.stdout的形式就是print的一种默认输出格式,等于print "%VALUE%"
    sys.stdout.flush() #强制刷新缓冲区,立刻进行打印,如果没有这一句就会一直在缓存里面,等到30*0.1秒后一次打印,进度条可以用这样的方式打印
    time.sleep(0.1) #这两个程序效果是一样的
    for i in range(30):
    print("*",end="",flush=True)
    time.sleep(0.1)
  10. f.truncate(size)  truncate()方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。f.truncate(5)表示只保留5个字符,后面的全部删除
  11. 文件读写模式总结:从别人博客截来的,感觉总结的不错,注意下,r+(如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容。),而w+是清空覆盖重新写

  

其他方法:

  • fileno() 方法返回一个整型的文件描述符
  • isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。

文件需要修改的话需要重写新的文件,在写到新的文件的时候可以修改内容(没啥别的办法)。类似下面代码就是这个过程:

f_read = open("test.txt", "r", encoding="utf-8")   #以utf-8格式读取出来,不然中文会乱码
f_write = open("test1.txt", "w", encoding="utf-8") #以utf-8格式打开写入,不然写入中文会乱码
number = 0
for i in f_read:
number += 1
#第五行加上喔喔喔喔四个字
if number == 5:
i = ''.join((i.strip(), "喔喔喔喔\n"))
f_write.write(i) f_write.close()
f_read.close()

with open(xxx) as f这种表达会自动帮你close文件,推荐使用这种方式。刚刚上面的方式可以改写为如下,功能是一样的:

with open("test.txt", "r", encoding="utf-8") as f_read, open("test1.txt", "w", encoding="utf-8") as f_write:   #同时管理多个文件对象
number = 0
for i in f_read:
number += 1
#第五行加上喔喔喔喔四个字
if number == 5:
i = ''.join((i.strip(), "喔喔喔喔\n"))
f_write.write(i)

第一篇我们实现过三级菜单的操作,现在这里我们将三级菜单存人文本中,然后可以对菜单进行增删改操作:

 下面是menu1菜单:

{
"广东省":{
"深圳市":{
"罗湖区":{},
"福田区":{},
"南山区":{}
},
"广州市":{
"白云区":{},
"天河区":{},
"越秀区":{},
"番禺区":{}
},
"东莞市":{
"虎门镇":{},
"樟木头":{},
"常平镇":{},
"大岭山":{}
}
},
"湖南省":{
"长沙市":{
"雨花区":{},
"岳麓区":{},
"芙蓉区":{}
},
"株洲市":{
"天元区":{},
"沪松区":{}
},
"邵阳市":{
"新邵县":{},
"大祥区":{},
"武冈":{},
"隆回县":{}
}
}
}

下面是实现代码:

# -*- coding:utf-8 -*-

'''
需求:
1、展示省市县(数据存在文件中)
2、对菜单实现可以增删改省市县 思路:
1、菜单存在文件里面,读取出来是str格式,通过eval(将字符串string对象转化为有效的表达式参与求值运算返回计算结果)转化成字典
2、对比原来的功能多了增加(add)、修改(change)、删除(delete)操作,这里就是多几个if判断
3、用户操作完之后呢,就需要修改完再以str格式写回文件内 ''' #第三版(实用版,通过文件存储信息然后操作) #通过读取文件读取菜单栏
with open("menu1", "r", encoding="utf-8") as f:
# str转化成字典
menu_dict = eval(f.read().strip()) #退出的标识位
flag = True #通过变量存储变化的菜单栏
current_menu = menu_dict #刚开始就是一级菜单栏 print(current_menu)
#通过列表记录以往的父级菜单
menu_list = [] while flag:
print(menu_list)
#打印菜单栏内容,跟current_menu有关
for menu in current_menu:
print(menu)
choice_menu = input("请选择需要查询的地区或增加(add)、修改(change)、删除(delete)操作,b返回上一层,q退出:").strip()
#查询
if choice_menu in current_menu:
#将父级菜单加入列表
menu_list.append(current_menu)
#变量存储子级菜单
current_menu = current_menu[choice_menu]
if not current_menu:
print("最后一层了")
#新增
elif choice_menu == "add":
menu_add = input("请输入要增加的内容:").strip()
if menu_add in current_menu:
print("你输入的已存在!")
else:
current_menu[menu_add] = {}
#修改
elif choice_menu == "change":
menu_old = input("请输入你要修改的内容:").strip()
if menu_old in current_menu:
menu_new = input("请输入你要修改为:")
current_menu[menu_new] = current_menu[menu_old]
current_menu.pop(menu_old)
else:
print("你输入要修改的内容不存在!")
#删除
elif choice_menu == "delete":
menu_delete = input("请输入要删除的内容:").strip()
if menu_delete in current_menu:
current_menu.pop(menu_delete)
else:
print("你要删除的内容不存在!")
#返回
elif choice_menu == 'b':
#如果列表记录无内容证明在第一层,所以就不需要执行返回上一层
if len(menu_list) == 0:continue
current_menu = menu_list.pop()
#退出
elif choice_menu == 'q':
flag = False
#如果在第三层直接退出,那么current_menu记录的肯定是第三层内容,所以我们需要拿到第一层所有菜单
if len(menu_list) == 0:
continue
else:
current_menu = menu_list[0]
else:
print("输入有误!") with open("menu1", "w", encoding="utf-8") as f:
#字典转成str写入
new_menu = str(current_menu)
f.write(new_menu)

Python全栈开发记录_第二篇(文件操作及三级菜单栏增删改查)的更多相关文章

  1. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  2. Python全栈开发记录_第九篇(面向对象(类)的学习)

    有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...

  3. Python全栈开发记录_第七篇(模块_time_datetime_random_os_sys_hashlib_logging_configparser_re)

    这一篇主要是学习python里面的模块,篇幅可能会比较长 模块的概念:在Python中,一个.py文件就称之为一个模块(Module). 模块一共三种: python标准库 第三方模块 应用程序自定义 ...

  4. Python全栈开发记录_第三篇(linux(ubuntu)的操作)

    该篇幅主要记录linux的操作,常见就不记录了,主要记录一些不太常用.难用或者自己忘记了的点. 看到https://www.cnblogs.com/resn/p/5800922.html这篇幅讲解的不 ...

  5. Python全栈开发记录_第八篇(模块收尾工作 json & pickle & shelve & xml)

    由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过, ...

  6. Python全栈开发记录_第四篇(集合、函数等知识点)

    知识点1:深拷贝和浅拷贝 非拷贝(=赋值:数据完全共享,内存地址一样,修改一个另一个也变化) 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)像[[1,2],3,4]如果修改列表中列 ...

  7. Python全栈开发记录_第六篇(生成器和迭代器)

    说生成器之前先说一个列表生成式:[x for x in range(10)]   ->[0,1,2....,9]这里x可以为函数(因为对python而言就是一个对象而已),range(10)也可 ...

  8. Python全栈开发记录_第五篇(装饰器)

    单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的(代码大约150行). 了解装饰器之前要知道三个知识点 作用域,上一篇讲到过顺序是L->E->G->B 高阶函数: 满 ...

  9. Python全栈开发记录_第十篇(反射及选课系统练习)

    反射机制:反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块中寻找指定函数,对其进行操作.也就是利用字符串的形式去对象(模块)中操作(查找or获取or删除or添加)成员,一种基于字符串的事件 ...

随机推荐

  1. react-native 打包apk

    如果你是学习Android的和我一样的话那一定会用一些软件开发,如WebStore 等等 那么这里我就来讲一下在WebStore 开发的App 如何打包成一个手机可以安装的apk软件 1.首先你的Ap ...

  2. Servlet过滤器实现访客人数统计

    第一. Servlet的创建和配置  1. 创建一个Servlet需要实现javax.servlet.Filter接口,同时实现Filter的3个方法.             第一个方法时过滤器中的 ...

  3. 演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)

    如注释所言 /** * Created by weiwei22 on 17/7/3. * * 这里主要是为了演示stop导致的数据不一致的问题.stop会暴力的结束线程并释放锁,所以有可能在恰好写了一 ...

  4. Android : Android Studio 更新至gradle 4.10.1后Variants API变化

    同步警告: WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'v ...

  5. NPOI 操作excel之 将图片插入到指定位置;

    //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClos ...

  6. for in& for each in &for of

    for...in语句以任意顺序遍历一个对象的可枚举属性.对于每个不同的属性,语句都会被执行. 语法 for (variable in object) {...} variable 在每次迭代时,将不同 ...

  7. 面向对象编程其实很简单--python面向对象(初级篇)

    出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...

  8. 还是畅通工程,最小生成树kruskal

    题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  9. 关于org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Incorrect string value: '\xE5\x91\xBC\xE5\x92\x8C...' for column 'visit_addr' at row 1的问题

    当我们使用Hibernate框架像表中插入一条新的数据时控制台可能会报这样的错误“org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Incorrec ...

  10. Windows7 密码修改

    一:不用输入原密码的方式修改用户的密码 1 命令行输入命令:mmc  #进入到控制台 2 点击左上角的文件,选择添加/删除管理单元 3 选择本地用户和组管理单元,添加到本地计算机,完成,确定 4 添加 ...