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. 内建函数之:reduce()使用

    #!/usr/bin/python#coding=utf-8'''Created on 2017年11月2日 from home @author: James zhan ''' print reduc ...

  2. centos7下stf安装介绍(一)----环境搭建

    重要:node version需要8.x.x 介绍 stf 全称 Smartphone Test Farm ,一款WEB 端移动设备批量管理工具(Remote control all your Sma ...

  3. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象

    学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...

  4. 添加网络打印机的步骤(xp和win2008+win7)

    1.如题,设置好打印机的 ip地址和子网掩码等信息. 2 .xp不像其他新的系统那么好用那么智能...只能慢慢来 如果是xp,注意,请添加网络打印机的时候选  :添加本地打印机,,记得哦 然后如图 然 ...

  5. datatables 行与列的数据获取

    datatables官网: https://datatables.net/reference/api/cells() 获取数据的方式如下 var table = $(selector).DataTab ...

  6. 7--Python入门--条件和循环

    5.1 条件语句 条件语句基本框架如下:if 判断语句1: 执行语句块1elif 判断语句2: 执行语句块2else: 执行语句块3 a = 10 if a%2 == 0 : #这里使用了取余函数% ...

  7. python实现简单的定时任务

    1.首先安装 schedule 模块 命令行安装 pip install schedule pyCharm编辑器安装 File->setting->project:youProject-& ...

  8. JUnit4测试报错:class not found XXX

     初学java框架,最近用eclipse跟着视频坐淘淘商城这个项目,其中使用了JUnit4做单元测试.当运行测试代码时,项目报错:class not found xxx. 借助了其他大神的博客,论坛等 ...

  9. Google - Find Most People in Chat Log

    1. 给你一个chatting log file,format大概是这样的: A: bla B: bla bla C: bla bla bla 要你找出说话最多(看word number) 的K个人 ...

  10. 【SpringBoot】整合定时任务和异步任务

    ========================10.SpringBoot整合定时任务和异步任务处理 =============================== 1.SpringBoot定时任务s ...